【问题标题】:Php efficiently mark messages as readphp 有效地将消息标记为已读
【发布时间】:2016-11-24 10:50:37
【问题描述】:

我有一个消息传递系统 (PHP/MYSQL),并且我已经准备好简单消息表中的已读/未读字段

Table
- msgbody
- datetime
- receipent
- read/unread
- sent/unsent (this field is for sending of notification)

我有 2 个问题

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

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

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

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

这是判断消息是否被阅读的正确方法吗?

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

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

  • 当 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 函数包括将表读取字段更新为 1,以及将 Pusher 发送给原始收件人,以便他们知道消息已被读取。

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

【问题讨论】:

  • 你的表结构看起来不太好。
  • 不,没有办法将SELECTUPDATE 组合在一个查询中。
  • 但听起来像是一次准备并执行多次的完美情况
  • 对不起,我正在添加代码,现在已经启用。

标签: javascript php jquery messaging


【解决方案1】:

您不能在单个查询中进行选择和更新。但是您不需要循环,您可以使用单个查询更新所有消息。

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

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

【讨论】:

  • 我试过这个,但是当消息发送得太快时我确实遇到了问题,所以更新和插入最终也会更新插入的消息。我不明白你所说的事务原子性是什么意思。所以我想我应该在检索它时将其设置为已读。但那一刻我还没有检索到其他数据。
  • 事务原子性意味着当您在事务中进行查询时,其他进程对数据库所做的更改对您是不可见的。
  • 哦,是的,顺便说一句,我还记得为什么这不起作用,因为我还需要将消息推送给原始发件人,并将他们的界面更新为 READ 状态。
  • 我只是改变了我的整个逻辑,不再需要大规模更新,并且只在请求单个消息时将状态更改为“已读”,然后我将选择并更新状态同时。但你的答案绝对正确!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2020-10-16
  • 2017-10-03
  • 2018-01-05
  • 1970-01-01
  • 2022-01-16
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多