2016-11-24 80 views
0

我有一个消息传送系统(PHP/MYSQL)和I已经制备的字段用于读/未读的简单消息表腓高效地将消息标记为已读

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作为我的前端,我可以做ajax调用php,但我仍然好奇我怎么做我在前端确定用户是否加载并看到消息或不。

任何人都可以看出它应该怎么做?

  • Ajax调用更新以在Ajax调用加载成功时读取?
  • 在读取数据库时Ajax调用来更新?
  • Ajax调用来更新......什么时候?

更新:添加代码。 我的php代码为INSERTING的消息

免责声明:代码工作正常。这是我需要帮助的过程。

$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']); 


} 

$这 - > updateRead功能包括更新表中读出字段设置为1,以及发送推到原来的收件人,让他们知道该消息被读出。

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

+0

您的表格结构看起来不太好。 – Phiter

+0

不,在单个查询中没有办法将'SELECT'与'UPDATE'结合起来。 – Barmar

+0

但是听起来像一个准备一次完美的情况,并执行许多 – RiggsFolly

回答

0

您无法在单个查询中进行选择和更新。但是你不需要循环,你可以用一个查询来更新所有的消息。

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

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

+0

我试过这个,但是当消息发送速度过快时,我确实遇到了问题,因此更新和插入最终更新了正在插入的消息。我不明白交易原子性是什么意思。所以我想我应该把它设置为Read,因为我正在检索它。但是那一刻我没有找到其他数据。 –

+0

事务原子性意味着当您在事务内进行查询时,其他进程对数据库所做的更改对您而言不可见。 – Barmar

+0

OH是的,我还记得为什么这不起作用,因为我还需要将消息推送给原始发件人,并用READ状态更新他们的界面。 –