JavaScript — эффективно помечать сообщения как прочитанные

У меня есть система обмена сообщениями (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 в качестве внешнего интерфейса, и я могу сделать 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 включает обновление поля чтения таблицы до 1, а также отправку Pusher исходному получателю, чтобы он знал, что сообщение прочитано.

Итак, что произойдет, если у меня будет 1000 сообщений, я могу закончить цикл 1000 раз, чтобы отметить 2-3 сообщения как прочитанные.

0

Решение

Вы не можете сделать выбор и обновить в одном запросе. Но вам не нужен цикл, вы можете обновить все сообщения одним запросом.

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

Если вы делаете это в транзакции, вам не нужно беспокоиться о новых сообщениях, добавляемых между двумя запросами. Атомарность транзакции должна гарантировать, что они видят ту же самую точку зрения базы данных.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]