MySQL / Php — Как получить / проверить, является ли сообщение новым для пользователя

#php #mysql

#php #mysql

Вопрос:

Я создаю форум, где люди могут задать вопрос и ждать ответов. Мне нужен способ проверить, является ли сообщение новым для пользователя или сообщение, если оно уже просмотрено. Если сообщение новое, мне нужно предоставить оповещение при входе пользователя в систему.

Какой наилучший способ / архитектура для достижения этого?

Комментарии:

1. вызовите ajax, когда пользователь входит в систему и проверяет базу данных.

Ответ №1:

Вы можете создать таблицу views таким образом

 - questionID
- userID
- lastMessageRead
  

Вы сохраняете в lastMessageRead идентификатор последнего сообщения, увиденного пользователем, который задает вопрос.
С помощью этого вы можете проверить, является ли lastMessageRead ID последнего ответа, запросить количество новых сообщений для этого вопроса и т.д…


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

 Table: answers
 ------------------------------------------------------------- 
|   answerID   |    questionID    |    userID    |    date    |
 ------------------------------------------------------------- 

Table: questions
 -------------------------------------------- 
|   questionID   |    userID    |    date    |
 -------------------------------------------- 

Table: views
 ------------------------------------------------------- 
|   questionID   |    userID    |    lastMessageRead    |
 ------------------------------------------------------- 

SELECT q.*, COUNT(*) AS nbMessages
FROM answers a
    LEFT OUTER JOIN questions q
        ON a.questionID = q.questionID
    LEFT OUTER JOIN views v
        ON v.questionID = q.questionID
WHERE q.userID = 10 # ID of current user
AND ( a.answerID > v.lastMessageRead OR v.lastMessageRead IS NULL )
GROUP BY q.questionID
HAVING nbMessages > 0
  

Комментарии:

1. Здесь одна проблема, которую я могу предвидеть, заключается в том, что нам нужно перейти к таблице ‘views’ и обновлять значение lastmessageRead каждый раз, когда зарегистрированный пользователь создает / удаляет новые сообщения.

2. Нет необходимости обновлять lastMessageRead при каждом создании / удалении сообщений. Это поле должно обновляться только тогда, когда пользователь прочитал вопрос, чтобы вставить идентификатор последнего прочитанного ответа (и если он не читал его раньше).

Ответ №2:

Предполагая, что в вашей базе данных есть таблица с именем messages , вы могли бы добавить дополнительное поле для хранения ее статуса «прочитано». Вы могли бы вызвать его is_new , и его тип данных был бы tinyint .

 Table: messages
 ------------------------------------------------------------- 
|   id   |    from    |    to    |    content    |  is_new    |
 ------------------------------------------------------------- 
  

При создании сообщения is_new поле по умолчанию должно иметь значение 1 (true). Когда пользователь входит в систему, извлеките сообщения пользователя из базы данных и те, с is_new == 1 , отобразите как новое сообщение или настройте соответствующее оповещение. После того, как пользователь прочитает или просмотрит сообщение, обновите is_new до 0 .

Ответ №3:

Основной способ добиться этого — ввести новый столбец в вашу таблицу «ответы»; столбец, который будет указывать, видел ли создатель вопроса ответ.

Давайте назовем этот столбец seen . По умолчанию оно равно ‘0’ и должно быть целым числом длиной в один символ.

Идея состоит в том, чтобы UPDATE присвоить ему значение ‘1’, когда пользователь посещает страницу ответа (если так работает ваша система).

Далее, это просто вопрос SELECT редактирования COUNT записей, которые имеют seen значение ‘0’.

Затем используйте if инструкцию, чтобы проверить, превышает ли значение счетчика нуль, и соответствующим образом настройте свое оповещение.

Ответ №4:

Для сообщения сохраните в базе данных некоторое поле флага, например is_new, чтобы проверить, является ли сообщение новым или нет.

 if(is_new == 0){
    //show alert or message to the user
    //set is_new = 1 in the database
}else{
    // Message is already read.
}
  

для этого должно быть сохранено значение поля Boolean.

Ответ №5:

Вы можете записать дату / время создания сообщения и дату / время последнего входа пользователя в систему. Если сообщение было создано после последнего входа в систему, оно новое.

Ответ №6:

вам нужна таблица для user_messages, чтобы сохранить идентификатор пользователя и сообщение и поместить поле флага сообщения для обнаружения (непрочитанное / прочитанное или удаленное …) в эту таблицу.

после вызова user login немедленно выполните запрос в таблице user_messages с идентификатором пользователя и флагом сообщения, чтобы обнаружить непрочитанные сообщения.

затем вы можете отправить пользователю любое уведомление по своему усмотрению.

Ответ №7:

Есть простое решение. ШАГ1:В таблице сообщений создайте новый столбец. Тип будет string. Если какой-либо пользователь увидит сообщение, он добавит #USER_ID # в этот столбец таблицы. ШАГ2:Когда новый пользователь придет посмотреть сообщение, проверьте его с помощью существующего столбца. Если недоступно, сообщение не просматривается, и вы можете обновить столбец.

Пример: идентификатор пользователя 1,2,3 уже видел сообщение. таким образом, столбец будет #1##2##3# . если пользователь 2 придет посмотреть сообщение, проверьте #2 # существует в столбце или нет.

 if (strpos('#1##2##3#', '#2#') !== false) {
    echo 'seen';
}else{
    echo 'not seen';
}
  

если пользователь 7 увидит сообщение, проверьте, существует #7 # в столбце или нет.

 if (strpos('#1##2##3#', '#7#') !== false) {
    echo 'seen';
}else{
    $new_string_for_table = '#1##2##3#'.'#7#';
    // update the column of the table
    // make the alert
 }