Php 高效地将消息标记为已读

Php efficiently mark messages as read

我有一个消息系统 (PHP/MYSQL),我已经在简单消息 table

中为 read/unread 准备了字段
Table
- msgbody
- datetime
- receipent
- read/unread
- sent/unsent (this field is for sending of notification)

我有 2 个问题

  1. 我明白当用户创建消息时我将插入 table 字段为未读,当我第一次检索消息时使用以下语句

     MYSQL statement: Select * from table WHERE receipient = "a";
    

我所做的是遍历数组,然后使用多个插入语句将未读字段设置为读取(非常低效!)

我是否可以在选择时放弃数组循环并更新字段?

这是确定邮件是否已读的正确方法吗?

2) 我使用 jquery 作为我的前端,我可以 ajax 调用 php,但我仍然很好奇我如何确定在前端用户是否加载并看到消息。

任何人都可以阐明应该如何完成?

更新:添加了代码。 我的 php 消息插入代码

免责声明:代码运行良好。这是我需要帮助的过程。

$query = $this->db->prepare('INSERT INTO table (msgbody,date time,recipient,read,sent) VALUES(:msg,:date,:user,:read,:sent);
if ($query->execute(array(
':msg' => $msg,
':date' => $datetime,
':user' => $user,
':read' => '0',
':sent' => '0'))) {
return TRUE;
}


My php code for retrieving of message

$query = $this->db->prepare('SELECT * FROM table WHERE recipient = :user);
if ($query->execute(array(
':user' => $user
))){

$data = $query->fetchAll();

foreach ($data as $msg) {
if $msg['read'] == '0';
$this->updateRead($msg['id']);


}

$this->updateRead 函数包括将 table 读取字段更新为 1,以及将 Pusher 发送给原始收件人,以便他们知道消息已被读取。

如果我有 1000 条消息,我最终可能会循环 1000 次,只是为了将 2-3 条消息标记为已读。

您不能在单个查询中执行 select 和更新。但是你不需要循环,你可以用一个查询更新所有消息。

START TRANSACTION;
SELECT * FROM table WHERE recipient = 'a';
UPDATE table SET read = 1 WHERE recipient = 'a';
COMMIT;

如果您在事务中执行这些操作,则不必担心在两个查询之间添加新消息。事务原子性应确保它们看到相同的数据库视图。