2013-04-09 82 views
0

我想通过Ajax将最新的mysql表中的条目拖动到div中并将其显示为html内容。我有一个Ajax和PHP功能正常,我唯一的问题是,我想查询新的条目,并在一个循环内的时间间隔堆栈结果,我遇到了两个问题:获取数据的行为像一个正常的JavaScript字符串,并获得循环只返回唯一的条目。如何通过JQuery/Ajax请求返回最新的Mysql条目

update.php文件

$con=mysqli_connect("mydbhost.com","username","password","database_name"); 
// Check connection 
if (mysqli_connect_errno()) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$result = mysqli_query($con,"SELECT * FROM conversations"); 
$j = 0; 
while($row = mysqli_fetch_array($result)) 
{ 
$carray[j] = $row['comment']; 
$j++; 
} 
$comment = (array_pop($carray)); 
echo $comment; 
echo "<br>"; 
mysqli_close($con); 

JQuery的Ajax请求循环:

$(document).ready(function(e){ 
    var comment; 
    function commentLoop() { 
    comment = $('#testdiv').load('update.php'); 
    $('#testdiv').append(comment); 
    setTimeout(commentLoop, 6000); 
    } 
    commentLoop(); 

    $(document).focus(); 
}); 
+1

作为一个以前的答案已经指出,您的SQL返回表中的一切,但你遍历所有数据,只返回最后在你的回声中排。此外,您正在使用'$ _POST ['comment']',但没有任何内容被发布到脚本中。最重要的是,在您的AJAX中,您将页面加载到div中,然后将该加载的结果(它是一个非返回函数)附加到同一个div。所以,真的,这里有很多事情可能会出错。 – Jon 2013-04-09 23:22:01

+1

我删除了$ _POST('comment')。这与我的错误没有任何关系。 – Emanegux 2013-04-09 23:28:53

+1

您仍在选择表格中的所有内容,只将其中一个发送回AJAX呼叫。如果需要,可以使用会话或其他方法,以便知道上次加载的位置,然后将其包含在select语句中,以便选择实际要处理的正确数量的行并将它们全部输出AJAX。而且,每次运行'commentLoop()'时,您仍然会替换整个DIV。 – Jon 2013-04-09 23:31:22

回答

1

这将算在表中的意见和选择最后输入的注释,然后把它们传递给阿贾克斯json数据仅在接收的计数大于表中的注释的计数低:

PHP:

if(isset($_GET['data'])) 
{ 
    $con  = new mysqli('host', 'user', 'password', 'database'); 
    $init_count = $_GET['data']; 
    $stmt1  = "SELECT COUNT(*) AS count FROM conversations"; 
    $stmt2  = "SELECT comment FROM conversations ORDER BY date_column DESC LIMIT 1"; 

    $total = $con->prepare($stmt1); 
    $total->execute(); 
    $total->bind_result($count); 
    $total->fetch(); 
    $total->close();  

    if(($init_count != '') && ($init_count < $count)) 
    { 
     $lastComment = $con->prepare($stmt2); 
     $lastComment->execute(); 
     $result = $lastComment->get_result(); 
     $row = $result->fetch_assoc(); 
     $lastComment->close(); 

     $data = array(
       'comment' => $row['comment'], 
       'count' => $count 
       ); 
    } 

    elseif($init_count == '') 
    { 
     $data = array(
     'comment' => '', 
     'count' => $count 
     ); 
    } 
    $pdo->close(); 
    echo json_encode($data); 
} 

HTML:

<input type="hidden" id="count" value="" /> 

JQUERY:

$(document).ready(function(e){ 

    function getComment(){ 
     var count = $('#test').val(); 
     $.ajax({ 
       type: 'get', 
       url: 'update.php?data=' + count, 
       dataType: 'json', 
       success: function(data) 
      { 
      $('#count').val(data.count); 
      if(data.comment) != $('#testdiv').html(data.comment); 
      } 
     }); 
    } 
    getComment(); 
    setInterval(getComment, 6000); 

}); 
3

的问题是这样做SELECT * FROM conversations你不停地请求整个表 - 尽管你只需要最后一个。

您的代码需要记住加载了哪条评论,并且只能获得比此更新的评论。

例如,假设您的主键是增量式,请执行SELECT * FROM conversations WHERE convid > ?。将?替换为已加载的最新评论。如果您是第一次加载,只需做SELECT * FROM conversations

您可以将使用请求参数显示的最后评论ID传递到update.php。此外,我再评JSON格式返回数据,所以你可以返回评论和id的集合,简单地分析它

+1

不是真的,他只收集最后一个(查看在while循环之后使用的'array_pop'方法)。而且,他每次调用'load'函数时都会替换整个DIV。 – Jon 2013-04-09 23:24:14

+0

我的$ comment变量只存储数组中最后一个以条目顺序存储所有注释的元素。 – Emanegux 2013-04-09 23:24:30

+0

@Emanegux是的,但是没有必要填充一整列的评论,然后只使用其中的一个并放弃其余的,如果你只需要最后一个,你应该只选择最后一个。 – Jon 2013-04-09 23:27:41

-1
SELECT * FROM conversations order by insert_date desc limit 10 

insert_date日期时间注释被插入,我希望你能有一个字段用于存储,如果不加上现在