如何向用户显示已输入新评论
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.......以上是关于如何向用户显示已输入新评论的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 的 UITextfield 中显示用户输入的密码