【问题标题】:How to show users that a new comment has been entered如何向用户显示已输入新评论
【发布时间】:2012-12-07 06:52:47
【问题描述】:

我正在创建一个小型博客。它从数据库中获取信息。我想向已登录的用户显示其他人刚刚输入了新评论。我创建了 3 个页面:old_count、new_count、posts。我打算为 new_count 和 old_count 创建一个会话,并在帖子中减去它们。结果将在 div 中显示给用户。我已经放弃了这个想法,因为 old_count 和 new_count 将具有相同的信息,因此帖子中的结果将始终为 0。我正在寻找类似 Twitter 的东西,如果有新条目,则会出现一个 div 显示 - 1 新帖子--。我一直在寻找一种方法来做到这一点。有人可以帮帮我吗。 (注意 - 请解释完整的脚本......提前谢谢!!!)

【问题讨论】:

  • AJAX 轮询或 websockets 或长轮询。这应该是一个很好的起点。

标签: php javascript jquery mysql ajax


【解决方案1】:

根据 David 发布的建议,我对之前提出的问题提出了以下解决方案。

  1. 我在登录时创建了一个时间戳。
  2. 然后我使用它在数据库上运行搜索。

包含此信息的 DIV 每 10 秒刷新一次,它是指向时间戳重置页面的可点击链接。该页面的代码如下:

<?php
session_start();

$reset = $_POST['reset'];

if($reset == 'reset')
{
$_SESSION['time_stamp'] = time();
echo "done";//confirmation purpose
}
?>

还有我控制整个节目的javascript:

<script type="text/javascript">
<!--
$(document).ready(function(){
$('#divname').click(function(){
var r="reset";

$.ajax({
type: "POST",
url: "reset_time.php",
data: r,
success: function(html){
if(html == 'done')
{
 $('#divwithinfo').reload(/*my blog page url*/);
}
});
});
});
-->
</script>

【讨论】:

    【解决方案2】:

    您必须存储登录时间戳用户。也许在数据库或会话中。对照评论时间戳检查它。 您必须显示已插入数据库中的所有 cmets 的通知并遵守以下条件

    1. Comment_Timestamp
    2. (Current_Timestamp - Comment_Timestamp)

    PHP:

    <?php
    
    /*
        DB CONNECT AND SQL TO SELECT COMMENTS FROM THE TABLE. YOU CAN OPTIMIZE QUERY TO REDUCE THE NUMBER OF
        TUPLES
    */
    
    $current_ts = strtotime(date('m/d/Y h:i:s a');
    $notified = array();
    
    foreach($all_comments as $comment) {
        if(strtotime($comment['ts']) < strtotime($_SESSION['user_login_ts'])) {
            if(($current_ts - strtotime($comment['ts']) <= REFRESH_INTERVAL) {
                $notified[] = $comment;     
            }
        }
    }
    
    echo json_encode($notified);
    
    ?>
    

    JS AJAX

    setInterval(function(){
        $.ajax({ 
            url: "server", 
            success: function(data) {
                /* Data is the JSON Object for new comments for that user */
            }, 
            dataType: "json"
        });
    }, <?=REFRESH_INTERVAL?>);
    

    【讨论】:

    • 这意味着,例如,如果我有 20 个用户登录并且一个人单击查看新帖子,这会将数据库中的新帖子设置为 1。这告诉我,当其他 19 个用户的 DIV 刷新时,它将向他们显示 0 个新帖子。我对吗?还是我只是在猜测?没有讽刺的意思
    • 您想将 cmets 与用户关联起来吗?所以如果我在 1 年后登录,我会收到关于我错过的所有 cmets 的通知吗?还是特定时间段的新 cmets?
    • 登录后新的cmets。但是您提供的答案会影响当前用户。就像我说的,我猜它会的。我在这里是因为我不知道........所以你告诉我我是否正确!!!!!!还是错了!!!!!!
    【解决方案3】:

    问题是:评论什么时候是新评论?如果它是在最近一次点击和当前点击之间创建的?或者如果用户还没有看到它?

    最简单的方法是在会话中存储“已知”的 cmets(例如 ID)并检查当前可用的 cmets。

    【讨论】:

    • 如果评论数量很大,那么在会话中存储一堆 ID 并对照另一组检查这些 ID 将非常低效。
    • @BurninlEO 你能给我一个样本吗?
    • 好吧-无论如何,您都必须检索 cmets 才能显示它们。这样做时,您可以将它们的 ID 写入数组。您可以轻松地将此数组与通过 array_diff() 存储的另一个数组进行比较。要将数组存储在会话中,您只需执行 ''$SESSION['cmets'] = $cmets;'' 如果我们谈论的是小于 100 个整数 ID 的 cmets,则每个用户的开销小于 1KB。优点是您可以向每个用户展示对他/她来说是新的 cmets。但是,如果您只想显示点击之间的变化,时间戳就足够了,而且效率更高。
    【解决方案4】:

    设置他们上次检查内容的时间戳。

    然后,使用 javascript 轮询服务器(SELECT * FROM posts WHERE created_timestamp > {$last_checked_timestamp}

    如果结果 > 0 则显示计数。

    更新时间戳。

    【讨论】:

    • 你能给我提供一个小样本吗?因为我看到如果我在上次检查时设置了时间戳,那么每次我用 jquery 或 ajax 刷新页面时,时间戳也会刷新。我相信!!!不确定!!!请提供样品!
    • 您对随着页面刷新而刷新时间戳是正确的。不过,这应该是正常行为,对吧?当您刷新页面时,您将新的时间戳设置为现在,并且应该会看到所有最新的帖子。回答这个问题:我访问了您的网站,您希望我的屏幕每 2 分钟更新一次新帖子吗?还是您希望我访问该站点并显示自上次访问以来有多少新帖子?
    • 我希望您能够在不经常刷新页面的情况下通读 cmets。这就是为什么我想要一个小 div 来显示在您花时间阅读时是否输入了任何新的 cmets。当您单击此按钮时,将出现新帖子,整个过程将重新开始。我知道如何用内容刷新 div,这是显示我无法获取的新帖子消息。
    • 这个想法可行..谢谢。我在登录时创建了一个时间戳。然后我从数据库中检索所有信息并显示它。然后,我创建一个页面,该页面将每 10 秒刷新一次,以查找在我登录时记录的时间戳之后输入的任何信息。然后我创建一个重置页面,以便当我单击新帖子 div 时,它将在重置页面上使用 ajax 将时间戳重置为单击 div 的时间。如果此重置成功,它将使用新的 cmets 重新加载 div.......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多