2013-08-29 4 views
0
if (isset($_POST['update'])){ 
    $db=mysqli_connect("localhost","****","****","****"); 
    $lasttime = isset($_POST['timestamp']) ? $_POST['timestamp'] : 0; 
    while (1){ 
     sleep(1); 
     clearstatcache(); 
     $mresult = mysqli_query($db,"SELECT * FROM tblchat WHERE msg_datetime > $lasttime"); 
     if (!empty($mresult)){ break; } 
    } 
    $msgs = array(); 
    while ($row = mysqli_fetch_object($mresult)) { $msgs[] = $row; } 
    mysqli_free_result($mresult); 
    $response = array(); 
    $response['msgs'] = $msgs; 
    echo json_encode($response); 
    flush(); 
    mysqli_close($db); 
    exit(); 
    } 

Код - это сервер для долгого опроса с клиентом. Если запрашивается обновление, циклы while проверяют любые новые сообщения, полученные после отметки времени, отправленной с запросом на обновление. Если он найден, он помещает результат в массив и возвращает его клиенту. В результате получается что-то вроде этого [msgs:[{msg_from:"",msg_to:"",msg:"",msg_datetime:""},{msg_from:"",msg_to:"",msg:"",msg_datetime:""}]]MYSQLi SELECT Fetch Object

Код работает отлично в первый раз и отправляет все последние сообщения, хорошо инкапсулированные, но затем снова отправляет пустой массив сообщений. Пожалуйста, направляйте меня.

+1

Приятная инъекция SQL –

+0

Приятно видеть, как люди переходят на MySQLi или PDO, и все же они продолжают вставлять свою переменную непосредственно в запрос вместо правильного использования подготовленных операторов; ( – Prix

+0

не могли бы вы просто переписать два запроса в моем коде правильно , я хочу научиться однажды навсегда, как предотвратить SQL-инъекцию. –

ответ

0

решен вопрос с mysqli_num_rows

if (mysqli_num_rows($mresult)){ $msgs = array(); while ($row = mysqli_fetch_object($mresult)) { $msgs[] = $row; } mysqli_free_result($mresult); break; } 
if (mysqli_num_rows($wresult)){ $writers = array(); while ($row = mysqli_fetch_object($wresult)) { $writers[] = $row; } mysqli_free_result($wresult); break; }  

спасибо всем за помощь!