2013-09-23 72 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对象。 –