如何向用户显示已输入新评论

Posted

技术标签:

【中文标题】如何向用户显示已输入新评论【英文标题】: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 或长轮询。这应该是一个很好的起点。 【参考方案1】:

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

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

包含此信息的 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 的通知并遵守以下条件

    Comment_Timestamp (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.......

以上是关于如何向用户显示已输入新评论的主要内容,如果未能解决你的问题,请参考以下文章

如何验证输入电子邮件是不是已存在于数据库中?

YouTrack 工作流编辑器 - 如何询问用户输入

在 Swift 的 UITextfield 中显示用户输入的密码

如何根据用户输入使用新谓词重新运行@FetchRequest?

当用户尝试再次输入用户名时,如何删除“您已注销”

如何在WordPress中显示用户的IP地址