在创建通知/警报时,如何知道何时将通知标记为已读
Posted
技术标签:
【中文标题】在创建通知/警报时,如何知道何时将通知标记为已读【英文标题】:In creating notifications/alerts, how to know when to mark the notification as read 【发布时间】:2012-12-06 13:30:47 【问题描述】:我正在使用 php 和 mysql 创建一个网站,并且目前正在处理一个处理通知的页面(例如,当有人在您的帖子上出现时,您会收到通知)。通知不是作为电子邮件发送的,而是作为您登录帐户时网站中的警报发送的(Facebook 风格)。
现在我的问题是确定何时将通知标记为已读。简而言之:什么事件(如点击、查看)发生后您可以确定通知已被阅读,并且您可以将其更改为已阅读?
【问题讨论】:
用户在通知上“鼠标悬停”之后 - 这也将涵盖关闭/回复事件 感谢 eicto(对于我迟到的回复感到抱歉)。但是手机上的用户(没有“鼠标悬停”功能)或者只是关闭 javascript 以便他们可以看到我受苦的恶意用户呢? 但我已经找到了解决办法。让我分享一下可能对某人有帮助: 【参考方案1】:但我已经找到了解决办法。让我分享一下可能对某人有帮助:
每个警报都应该将用户引导到某个 URL,例如如果有人对您的帖子发表评论,则在单击警报时应将您定向到例如“www.example.com/posts/?post_id=5”。我将此称为目标 URL。生成警报时,我将其目标 URL 与警报详细信息一起存储在警报表中,并获取 AI 唯一字段(alert_id),我将使用该字段生成警报上任何链接的 href 部分,例如 <a href="changetoread.php?alert_id=56">G Thuo</a>
已评论在你的帖子上。
这是我的方法:单击任何警报时,它首先将您带到其状态更改为已读的位置(基于链接中的 alert_id)。将其更改为读取后,我们从表中获取目标 URL 并将用户重定向到那里。这是我的代码:
$alert_id=$_GET['alert_id'];
$user_id=$_SESSION['user_id'];
//create the SQL to update the read_status
$sql="UPDATE alerts_log SET read_status=1 WHERE alert_id=$alert_id AND user_id=$user_id";
$res=mysql_query($sql) or die(mysql_error());
//we can now extract the targer_url from the alerts table and redirect the user automatically to that URL
$sql="SELECT target_url FROM alerts WHERE alert_id=$alert_id";
$res=mysql_query($sql) or die(mysql_error());
$row=mysql_fetch_assoc($res);
$url=$row['target_url'];
//redirect the user to that URL
header("Location: $url");
`
【讨论】:
您的代码非常容易受到 SQL 注入的影响。changetoread.php?alert_id=0 OR 1=1 --
将 ALL 将 alerts_log
行更改为 read_status
1. 考虑将 MySQLi 或 PDO 与准备好的语句一起使用:***.com/questions/12859942/…
嗯,我有点害怕。如果我只在检查 is_numeric($_GET['user_id'])
的计算结果为 true 后才运行查询会怎样?
理论上可行,但是当你需要一封信的时候呢?然后你又遇到了同样的问题,什么也做不了。如果您不想切换到 MySQLi 或 PDO,请至少对您放入 SQL ($sql = "UPDATE alerts_log SET read_status=1 WHERE alert_id=" . mysql_real_escape_string($alert_id) . " AND user_id=" . mysql_real_escape_string($user_id)
) 的 任何 变量使用 mysql_real_escape_string
函数。但是请注意,不推荐使用 MySQL (check the red box on top of all the mysql
pages page)
或者只是$alert_id=$_GET['alert_id']*1
$_SESSION['user_id']*1
@eicto,*1
是做什么的?以上是关于在创建通知/警报时,如何知道何时将通知标记为已读的主要内容,如果未能解决你的问题,请参考以下文章
使用 Exchange Web Services 2007 将电子邮件标记为已读