Я создаю сайт социальной сети в PHP / MySQL / jQuery. Когда пользователь регистрируется на моем сайте, я хотел бы запросить базу данных и получить объявление администратора, если оно существует. Это будет окно сообщения, которое отображается на странице всем пользователям, но у него будет X, чтобы щелкнуть по нему, а не показывать его снова, пока администратор не опубликует новое объявление. Поэтому, если вы никогда не нажимаете на X, и есть сообщения об объявлении, которые существуют в db, он всегда отображает это окно сообщения на вашей странице, однако, если вы сделали cli9ck X, чтобы закрыть окно, вы вернетесь на страницу, на которой он будет не существует, если не будет опубликовано новое сообщение администратора.
Я знаю, что есть несколько способов сделать это, но я ищу наиболее эффективный способ.
Одна из моих идей, если я добавлю дополнительное поле mysql в таблицу пользователя «admin_message» и отметьте его как 0, тогда, когда я опубликую новое сообщение администратора, он изменит запись для каждого пользователя на 1, если сообщение администратора установлено на 1, то он отображается на странице пользователя. Затем, когда пользователь нажимает кнопку X, чтобы скрыть это поле, он обновит там строку пользовательской таблицы и изменит значение на 0.
Еще одна идея, которую я имею в том, чтобы использовать cookie для проверки того, выбрал ли пользователь скрытие сообщения, я думаю, что это будет быстрее, но, возможно, не так хорошо, поскольку пользователь может входить в систему с разными компьютерами, и если будет показано новое сообщение, они могут не вижу его сразу.
Поэтому мне просто интересно, не плохо ли использовать дополнительное поле базы данных? Если бы у меня было 1 000 000 пользователей, когда я отправил новое сообщение администратора, мне нужно было бы обновить 1000 000 строк, чтобы каждый мог видеть это сообщение. Есть ли способ лучше? Также, как только пользователь войдет в мой сайт, я буду использовать сеанс для хранения значения, которое они видят или скрывают сообщение, а не смотрят на БД при каждой загрузке страницы.
ОБНОВИТЬ
Извините, я думаю, что мой пост мог быть немного запутанным или непонятным в том, что именно я имел в виду, потому что большинство ответов удовлетворяется с помощью системы сообщений, в которой это не так близко.
Забудьте слово сообщения, пожалуйста, я попытаюсь объяснить другим словом. Допустим, на сайте есть 1 администратор, это единственный администратор, который может отправлять сообщения пользователям. Пользователи будут видеть только 1 сообщение, если в течение всего срока службы сайта было отправлено 2352345234 сообщений, это не имеет значения, они будут видеть только 1 сообщение, самое новое сообщение.
Теперь некоторые пользователи, которые входят в систему и видят это сообщение «div» на странице, могут устать смотреть на нее, поэтому они смогут скрыть это от показаний снова.
Это будет так просто, как «да» или «нет» для показа этого сообщения на странице.
Однако, если я решил, что мне нужно опубликовать новое сообщение администратора для всех пользователей, чтобы увидеть, тогда даже пользователь, который решил скрыть и не отобразить сообщение администратора, все равно увидит его снова, пока не решит никогда больше его не видеть.
Два простых решения заключаются в следующем:
Хорошо. Проверьте файл cookie пользователей, если он содержит флаг, указывающий, что сообщение было отображено, не отображает сообщение, иначе отобразите его. Когда пользователь закрывает его, обновите файл cookie. Плюсы: абсолютно простые. Минусы: пользователь может видеть одно и то же сообщение дважды в зависимости от того, очищают ли они свои файлы cookie или регистрируются с другого компьютера.
Лучше: храните флаг в базе данных где-нибудь (вы можете сохранить его в таблице пользователя администратора сейчас, а вниз по строке разбить его на другую таблицу). Когда пользователь входит в систему, 1) сохраните этот флаг в cookie или сеансе пользователя, 2) обновите базу данных, 3) решите, должно ли отображаться сообщение. Когда пользователь закрывает сообщение, обновите файл cookie / сеанс и базу данных. Плюсы: пользователь никогда не получает сообщение дважды. Минусы: немного больше, поскольку вам нужно поддерживать флаг в db.
Детали реализации: для флага вы можете использовать идентификатор сообщения, как было предложено, или, скорее всего, вы уже сохранили последнюю временную отметку пользователя и можете использовать ее.
Каждый пользователь может иметь last_message_seen , поэтому вам нужно запросить «новые» сообщения (message_id> last_message_seen) для вашего пользователя. Если вы [X] закрываете (или тайм-аут), тогда ваш javascript может проверять новые сообщения и так далее …
Другая идея состоит в том, чтобы последнее сообщение увидело число в среде javascript , но в этом случае оно будет сброшено (пересчитано) при обновлении / оставлении страницы, а если это не в БД, ваш пользователь может пропустить сообщения, вставленные между последними загрузки страницы и обновления.
Или … это может быть на сессии , поэтому вы не пропустите ни одного. Когда вы входите в систему, номер сбрасывается до некоторого «нормального» номера, скажем: последнее сообщение или сообщение после (сейчас – 1 час) или что-то еще …
У вас есть время входа для пользователя? Как last_login datetime?
Так что получите все сообщения, где date_created> = last_login. Отобразите их, а затем обновите время last_login до now ().
Я бы использовал идею №1. Я бы не использовал bool-поле, чтобы проверить, прочитал ли пользователь сообщение, я бы использовал поле datetime с некоторым значением по умолчанию. Если поле == по умолчанию, непрочитанное. При чтении задайте поле NOW ().
Таким образом, вы знаете, насколько быстро ваши пользователи читают сообщение.
РЕДАКТИРОВАТЬ:
после вашего редактирования я все равно использую тот же механизм. Для сообщения требуется поле, чтобы узнать, читается ли оно. Если пользователи нажимают на X (для закрытия), обновите db и отметьте сообщение как прочитанное.
Если администратор отправляет новое сообщение, это всплывающее окно.
Вам также нужно создать дату-время для вашего messahe, потому что если пользователь не закрыл предыдущее сообщение, а администратор отправляет новый, может отображаться только последнее сообщение.
EDIT2: В ответ на этот комментарий:
Даже если пользователь пропустил сообщение, нужно показать только самые новые. Возможно, я ошибаюсь, но похоже, что вы говорите, что обычно отмечаете сообщение, прочитанное 100 000 раз, – 100 000 пользователей щелкают по X, и я думаю, что он должен быть больше в таблице пользователя, показывать или не показывать окно сообщения, а не на индивидуальной основе
в вашей теории что-то не логично. Вы хотите сохранить «show / not show» в качестве настройки, но вы хотите показать сообщение в любом случае. Как вы знаете, когда нужно отменять набор пользователей и не забывать, показывала ли система сообщение пользователю? Даже если вы хотите просто показать его один раз, вам понадобится поле в базе данных (на уровне сообщений), чтобы сохранить, показывала ли система сообщение пользователю или нет.
Я бы рекомендовал иметь таблицу admin_message_queue. Он будет иметь тело сообщения, идентификатор пользователя и идентификатор сообщения. Когда вы публикуете новое сообщение администратора, оно добавит запись для каждого пользователя-администратора в эту таблицу. Затем, когда вы входите в систему, вы просто выбираете все строки admin_message_queue, где идентификатор пользователя = зарегистрированный пользователь.
Чтобы избавиться от сообщения, у вас просто есть кнопка закрытия, активирует обратный вызов AJAX на метод на сервере, который принимает идентификатор сообщения. Этот метод удалит из admin_message_queue, где идентификатор сообщения = тот, который был отправлен, и идентификатор пользователя – идентификатор пользователя из сеанса. Таким образом, пользователь не может удалять сообщения для кого-то другого.
Выполнение этого способа избавляет вас от необходимости хранить строки просматриваемых сообщений. Зачем немного переключаться, чтобы скрыть это для кого-то? В конечном итоге вы будете хранить множество данных, которые больше не используются.
Обновлено после обновления вопроса: Извините, я думал, что вы пытаетесь показать сообщения только администраторам. Вы можете сохранить эту же логику для отображения самого последнего сообщения для всех пользователей. Просто используйте таблицу с идентификатором пользователя, текст сообщения. Всякий раз, когда вы отправляете сообщение, оно будет проходить и перезаписывать текст сообщения всем людям, у которых есть записи, все еще существующие (люди, которые не скрывали сообщение), и добавляют строки для других людей. Когда они скрывают сообщение, удалите эту строку пользователя.