2013-09-23 2 views
1

Я пытаюсь получить новые строки из базы данных с помощью ajax. как то, что происходит в чате facebook. То, что я делал, я получаю последние десять строк из базы данных с помощью ajax каждые две секунды и пытаюсь показать те, которых пользователь не видел. У меня два столбца, id и имя. Я создал упорядоченный список и установил каждый id элементов li в id из базы данных. каждый li для строки. затем я пытаюсь получить идентификатор последнего элемента li и проверить, больше ли идентификатор из базы данных, если он затем добавляет новый li, содержащий идентификатор и имя. но по какой-то причине он просто добавляет целых 10 строк каждые две секунды. что я сделал не так? это код, который я использую.показать только последние строки из базы данных с помощью jquery

<ol id="output"><li id="1">test</li></ol> 

<script id="source" language="javascript" type="text/javascript"> 



function reloadw() 
{ 


$.ajax({          
    url: 'api.php',     
    data: "",   
    dataType: 'json',      
    success: function(rows)   
    { 
    for (var i in rows) 
{ 
var row = rows[i]; 
    var lastId = $('ol#output li').attr('id'); 
    var id = row[0]; 
    var vname = row[1]; 



    if(id > lastId){ 
    $('#output').append("<li id="+id+"><b>id: </b>"+id+"<b> name: </b>"+vname+"</li>"); 
    }} 
    } 

}); 
} setInterval(reloadw,2000); 

это то, что я использую в получении данных из БД

$result = mysql_query("SELECT * FROM $tableName ORDER BY id");    
$data = array(); 
for($i=0;$i<=9;$i++){ 
$row = mysql_fetch_row($result); 
$data[] = $row; 
} 
echo json_encode($data); 
+0

Вы не считаете, что просто запустили sql-запрос из последнего id? – stevemarvell

+1

Почему вы не используете 'LIMIT' в своем запросе? То, как вы сейчас делаете, будет извлекать все записи из базы данных при каждом вызове ajax, что является проблемой производительности. – Deepak

+0

Я пытаюсь написать приложение для чата, поэтому возврат последней строки определенного количества строк не будет – Youngestdj

ответ

1

Если вы берете вопрос, где вы забирающий данные, еще один вопрос, у вас есть в вашем яваскрипта коде ,

Изменить

var lastId = $('ol#output li').attr('id'); //will always fetch the first li's id 

в

var lastId = $('ol#output li:last').attr('id'); 

С кодом lastId выбора, что у вас есть, он всегда будет получать только идентификатор первого и ваше сравнение id > lastId всегда будет верно, за исключением идентификатор первого элемента. Таким образом, вы заканчиваете добавление, даже если эта запись уже была добавлена ​​раньше.

Но в идеале вы должны сделать эту логику на сервере, чтобы получить только данные, которые будут представлены.

0

Если вы хотите сортировать последний результат из базы данных это очень просто, вы можете попробовать этот код в SQL: $result = mysql_query("SELECT * FROM $tableName ORDER BY id DESC");

0
var lastId = $('ol#output li').attr('id'); 

Эта линия всегда будет искать в первый элемент в списке, тогда как вы, вероятно, ищете последнее. Попробуйте заменить линию:

var lastId = $('ol#output li').last().attr('id'); 
0

Вы можете написать свой код JavaScript следующим образом.

<script> 

     var seen = new Array(); 
     function reloadw(){ 


     $.ajax({          
      url: 'api.php',     
      data: "",   
      dataType: 'json',      
      success: function(rows){ 

      rows.forEach(function(row){ 


       if(seen.indexOf(row.id) == -1){ 

         $('#output').append("<li id="+row.id+"><b>id: </b>"+row.id+"<b> name: </b>"+row.name+"</li>"); 

          seen.push(row.id); 

         } 

}); 

     } setInterval(reloadw,2000); 
    </script> 
+0

Я пробовал ваш код, и он возвращал «id: undefined name: undefined». – Youngestdj

+0

Строки должны быть массивом объектов с идентификатором и именем. Серверный код должен сделать объект таким, как прежде, чем сделать строку JSON. Возможно, вам придется использовать JSON.parse (rows) .forEach (function (row) {// do stuff}); если запрос ajax автоматически не преобразует его в объект JSON. –

Смежные вопросы