У меня есть система обмена сообщениями (PHP / MYSQL), и я уже подготовил поле для чтения / чтения в простой таблице сообщений
Table
- msgbody
- datetime
- receipent
- read/unread
- sent/unsent (this field is for sending of notification)
У меня 2 вопроса
Я понимаю, что когда пользователь создает сообщение, я вставляю его в таблицу с полем как Непрочитанное, и когда я получаю сообщение в первый раз со следующим утверждением
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 включает обновление поля чтения таблицы до 1, а также отправку Pusher исходному получателю, чтобы он знал, что сообщение прочитано.
Итак, что произойдет, если у меня будет 1000 сообщений, я могу закончить цикл 1000 раз, чтобы отметить 2-3 сообщения как прочитанные.
Вы не можете сделать выбор и обновить в одном запросе. Но вам не нужен цикл, вы можете обновить все сообщения одним запросом.
START TRANSACTION;
SELECT * FROM table WHERE recipient = 'a';
UPDATE table SET read = 1 WHERE recipient = 'a';
COMMIT;
Если вы делаете это в транзакции, вам не нужно беспокоиться о новых сообщениях, добавляемых между двумя запросами. Атомарность транзакции должна гарантировать, что они видят ту же самую точку зрения базы данных.
Других решений пока нет …