2013-09-23 44 views
1

我一直在嘗試從ajax的數據庫中檢索新行。就像在Facebook聊天中發生的那種事情一樣。我一直在做的是每兩秒從數據庫中獲取最後十行數據,並嘗試顯示用戶沒有看到的數據。我有兩列,id和名字。我創建了一個有序列表,並將每個li元素id設置爲數據庫中的id。每個李是一排。然後我嘗試獲取最後一個li元素的id,並檢查數據庫中的id是否更大,如果它附加了包含id和name的新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); 

這是我從DB

$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

你有沒有考慮過只是從最後一個ID運行SQL查詢? – stevemarvell

+1

爲什麼不在你的查詢中使用'LIMIT'?你現在正在做的方式將從每個ajax調用數據庫中獲取所有記錄,這是性能問題。 – Deepak

+0

我正在嘗試編寫一個聊天應用程序,因此返回特定行數的最後一行將不會執行 – Youngestdj

回答

1

檢索數據使用。如果你把你在哪裏獲取數據的問題,你有另外一個問題是在你的JavaScript代碼。

變化

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和你的比較id > lastId將永遠是除了真正第一個元素的ID。因此,即使該記錄已經被添加過,也最終會追加。

但理想情況下,您應該在服務器上執行此邏輯以僅獲取要呈現的數據。

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

行需要是帶有id和name字段的對象數組。服務器端代碼在創建JSON字符串之前需要創建對象。你可能需要使用JSON.parse(rows).forEach(function(row){// do stuff});如果ajax請求不會自動將其轉換爲JSON對象。 –