0

我需要有关实时更新消息的建议,这是我的代码:

<script>
    function fetch_messages(){
        var user_id = "1" // example id

        $.ajax({
            url: "do_fetch.php",
            type: "POST",
            data: { user_id : user_id },
            dataType: "json",
            success: function(data) {
                for (var i = 0; i < data.length; i++) {
                    $("#messages_list").append('<div id="'+data.id+'">'+data.message+'</div>');
                }
                setTimeout("fetch_messages()", 3000);
            }
        });
    }
    $(function(){
        fetch_messages();
    });
</script>

并且有 div 消息:

<div id="messages">
</div>

php代码:

<?php
    include('connection.php')

    $user_id = $_POST['user_id'];
    $my_id = $_SESSION['user_id'];

    $sql = 'SELECT * FROM messages WHERE user_id = '.mysql_real_escape_string($user_id).' AND my_id = '.mysql_real_escape_string($my_id);
    $result = mysql_query($sql, $connection);

    echo json_encode($result);
?>

此代码有效,但我不想阅读所有消息并显示它们,我只需要加载新消息,那么我应该怎么做呢?我是否需要放置一个带有时间戳的隐藏字段并使用 ajax 来检查比这更晚的时间?

4

4 回答 4

2

保存发送的最后一条消息的 id,然后通过 ajax 发送该 id,并查询比该 id 新的所有内容。

于 2012-07-27T14:06:23.847 回答
2

首先,您在 ul 中仅使用 ajax 加载 20 条消息

<ul>
  <li>message 1</li>
  <li>message 2</li>
  <li>message 3</li>
  <li>message 4</li>
  <li>message 5</li>
  <li id="{{message_date}}">message 6</li>
</ul>

然后获取最后一条消息 id 以获取日期。

$('li').last().attr('id')

你可以有一个点击按钮来加载更多。

var message_date = $('li').last().attr('id');
$.ajax({
    url: "do_fetch.php",
    type: "POST",
    data: { date : message_date },
    dataType: "json",
    success: function(data) {
        for (var i = 0; i < data.length; i++) {
            $("ul").append('<liid="'+ data.date+'">'+data.message+'</li>');
        }
    }
});

在 php 文件中,您选择日期 > message_date 限制为 30 的消息。

您也可以传递用户 ID。

于 2012-07-27T14:15:26.650 回答
1

您需要在表中添加一个“读取”布尔字段。它应该默认为 false,然后每当查看消息时,您应该更新所有查看的消息以进行阅读。

SELECT * FROM `messages` WHERE user_id=? AND my_id=? AND `read`=0;
UPDATE `messages` SET `read`=1 WHERE user_id=? AND my_id=?;
于 2012-07-27T14:07:18.293 回答
1

例如,您可以使用 next: setInterval(fetch_messages,5000) 。每五秒发送一次请求。比在服务器上保存会话当前时间(第一次)。在第二次请求中,上次从会话获取,而不是获取当前时间并获取当前和上次之间的所有行。

于 2012-07-27T14:13:36.307 回答