我有一个消息传递系统(PHP / MYSQL),我已经在简单的消息表中准备了读/未读的字段
Table
- msgbody
- datetime
- receipent
- read/unread
- sent/unsent (this field is for sending of notification)
我有两个问题
我理解当用户创建消息时,我将插入到表中,字段为Unread,当我第一次使用以下语句检索消息时
MYSQL statement: Select * from table WHERE receipient = "a";
我做的是通过数组,然后使用多个插入语句将未读字段设置为读取(非常低效!)
无论如何我可以放弃数组循环并在选择时更新字段吗?
这是确定是否读取消息的正确方法吗?
2)我正在使用jquery作为我的前端,我可以对php进行ajax调用,但我仍然很好奇我该如何做我在前端确定用户是否加载并看到了消息
任何人都可以了解应该如何做?
更新:已添加代码。 我的用于INSERTING消息的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条消息标记为“读取”。
答案 0 :(得分:0)
您无法在单个查询中执行选择和更新。但是您不需要循环,您可以使用单个查询更新所有消息。
START TRANSACTION;
SELECT * FROM table WHERE recipient = 'a';
UPDATE table SET read = 1 WHERE recipient = 'a';
COMMIT;
如果您在事务中执行这些操作,则不必担心在两个查询之间添加新消息。事务原子性应确保它们看到相同的数据库视图。