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 个问题
我明白当用户创建消息时我将插入 table 字段为未读,当我第一次检索消息时使用以下语句
MYSQL statement: Select * from table WHERE receipient = "a";
我所做的是遍历数组,然后使用多个插入语句将未读字段设置为读取(非常低效!)
我是否可以在选择时放弃数组循环并更新字段?
这是确定邮件是否已读的正确方法吗?
2) 我使用 jquery 作为我的前端,我可以 ajax 调用 php,但我仍然很好奇我如何确定在前端用户是否加载并看到消息。
任何人都可以阐明应该如何完成?
- Ajax当Ajax调用加载成功时调用更新读取?
- Ajax读取数据库时调用更新?
- Ajax调用更新……什么时候?
更新:添加了代码。
我的 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;
如果您在事务中执行这些操作,则不必担心在两个查询之间添加新消息。事务原子性应确保它们看到相同的数据库视图。
我有一个消息系统 (PHP/MYSQL),我已经在简单消息 table
中为 read/unread 准备了字段Table
- msgbody
- datetime
- receipent
- read/unread
- sent/unsent (this field is for sending of notification)
我有 2 个问题
我明白当用户创建消息时我将插入 table 字段为未读,当我第一次检索消息时使用以下语句
MYSQL statement: Select * from table WHERE receipient = "a";
我所做的是遍历数组,然后使用多个插入语句将未读字段设置为读取(非常低效!)
我是否可以在选择时放弃数组循环并更新字段?
这是确定邮件是否已读的正确方法吗?
2) 我使用 jquery 作为我的前端,我可以 ajax 调用 php,但我仍然很好奇我如何确定在前端用户是否加载并看到消息。
任何人都可以阐明应该如何完成?
- Ajax当Ajax调用加载成功时调用更新读取?
- Ajax读取数据库时调用更新?
- Ajax调用更新……什么时候?
更新:添加了代码。 我的 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;
如果您在事务中执行这些操作,则不必担心在两个查询之间添加新消息。事务原子性应确保它们看到相同的数据库视图。