Лучший способ показать сообщение администратора определенным пользователям? - PullRequest
5 голосов
/ 13 января 2010

Я строю сайт социальной сети на PHP / MySQL / jQuery. Когда пользователь заходит на мой сайт, я хотел бы запросить БД и получить объявление администратора, если таковое существует. Это будет окно сообщения, которое будет отображаться на странице для всех пользователей, но у него будет X , чтобы щелкнуть по нему и больше не показывать, пока администратор не опубликует новое объявление. Так что, если вы никогда не нажимаете X и в db есть сообщения объявлений, он всегда будет показывать это окно сообщений на вашей странице, однако, если вы нажали X, чтобы закрыть окно, то вы вернетесь на страницу, на которой он будет не быть там, если не будет опубликовано новое сообщение администратора.

Я знаю, что есть несколько способов сделать это, но я ищу наиболее эффективный способ.

У меня есть одна идея: если я добавлю дополнительное поле mysql в таблицу пользователя «admin_message» и пометю его как 0, то при публикации нового сообщения администратора будет изменена запись для каждого пользователя на 1, если сообщение администратора устанавливается на 1, то это отображается на странице пользователя. Затем, когда пользователь щелкает X, чтобы скрыть поле, он обновляет строку таблицы пользователя и возвращает значение обратно в 0.

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

Так что мне просто интересно, если это плохая идея использовать дополнительное поле базы данных? Если бы у меня было 1 000 000 пользователей, когда я отправил новое сообщение администратора, мне нужно было бы обновить 1 000 000 строк, чтобы все могли видеть сообщение. Есть ли способ лучше? Также, как только пользователь заходит на мой сайт, я буду использовать сеанс для хранения значения, которое он видит, скрывая или скрывая сообщение, а не просматривая БД при каждой загрузке страницы.



ОБНОВЛЕНИЕ

Извините, я думаю, что мой пост мог быть немного запутанным или неясным, что именно я имел в виду, потому что большинство ответов направлено на систему сообщений, с которой это не очень близко.

Забудьте слово сообщения, пожалуйста, я постараюсь объяснить другим словом. Допустим, на сайте есть 1 администратор, это единственный администратор, который может отправить сообщение для просмотра пользователям. Пользователи увидят только 1 сообщение, если за время существования сайта будет опубликовано 2352345234 сообщения, это не имеет значения, они увидят только 1 сообщение, самое новое сообщение.

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

Это будет так же просто, как да или нет, чтобы показать это сообщение на этой странице.

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

Ответы [ 5 ]

3 голосов
/ 13 января 2010

Два простых решения следующие:

Хорошо: проверьте cookie пользователя, если он содержит флаг, указывающий, что сообщение было отображено, не отображает сообщение, в противном случае отображает его. Когда пользователь закроет его, обновите cookie. Плюсы: абсолютно просто. Минусы: пользователь может увидеть одно и то же сообщение дважды, в зависимости от того, удалят ли они свои куки или войдут с другого компьютера.

Лучше: где-нибудь хранить флаг в базе данных (вы можете пока сохранить его в таблице администраторов, а затем разбить его на другую таблицу). Когда пользователь входит в систему, 1) сохранить этот флаг в файле cookie или сеансе пользователя, 2) обновить базу данных, 3) решить, нужно ли показывать сообщение. Когда пользователь закрывает сообщение, обновите cookie / сессию и БД. Плюсы: пользователю никогда не показывают сообщение дважды. Минусы: немного сложнее, так как вам нужно поддерживать флаг в БД.

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

1 голос
/ 13 января 2010

Вы сохраняете время входа для пользователя, верно? Как date_login datetime?

Так что получите все сообщения, где date_created> = last_login. Отобразите их, затем обновите время last_login до now ().

1 голос
/ 13 января 2010

Каждый пользователь может иметь last_message_seen , поэтому вам необходимо запросить «новые» сообщения (message_id> last_message_seen) для вашего пользователя. Если вы закрыли [X] (или тайм-аут), тогда ваш javascript может проверять новые сообщения и так далее ...

Другая идея состоит в том, чтобы иметь последнее просмотренное число в среде javascript , но в этом случае оно будет сброшено (пересчитано), когда вы обновите / откажетесь от страницы, а если ее нет БД ваш пользователь может пропустить сообщения, вставленные между последней загрузкой страницы и этим обновлением.

Или ... это может быть в сеансе , так что вы не пропустите ни одного. Когда вы входите в систему, номер сбрасывается до некоторого «нормального» числа, скажем: последнее сообщение или сообщение после (сейчас - 1 ч), или что-то еще ...

1 голос
/ 13 января 2010

Я бы использовал идею # 1. Я бы не использовал bool-field для проверки, прочитал ли пользователь сообщение, я бы использовал поле datetime с некоторым значением по умолчанию. Если поле == по умолчанию, непрочитано. Когда прочитано, установите поле NOW ().

Таким образом, вы точно знаете, насколько быстро ваши пользователи читают сообщение.

EDIT:

после вашего редактирования я бы все еще использовал тот же механизм. Сообщение нуждается в поле, чтобы узнать, читается или нет. Если пользователь нажимает X (чтобы закрыть), обновите базу данных и отметьте сообщение как прочитанное.

Если администратор отправит новое сообщение, появится всплывающее окно.

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

EDIT2: В ответ на этот комментарий:

Даже если пользователь пропустил сообщение, только самый новый должен быть показан. Может быть, я неправильно, но звучит как ты говорят, чтобы в основном пометить сообщение читать 100 000 раз это 100 000 пользователей нажмите X, и я думаю, что это должно быть больше на пользовательской таблице, показывать или не показывать показать окно сообщения, а не на человека основа

что-то не является локальным в вашей теории. Вы хотите сохранить «показать / не показать» в качестве параметра, но вы все равно хотите показать сообщение. Как вы знаете, когда отменить настройку пользователя, а когда не забыли, показала ли система сообщение пользователю? Даже если вы хотите просто показать его один раз, вам понадобится поле в базе данных (на уровне сообщений), чтобы хранить информацию о том, показала ли система сообщение пользователю или нет.

0 голосов
/ 13 января 2010

Я бы рекомендовал иметь таблицу admin_message_queue. Он будет иметь тело сообщения, идентификатор пользователя и идентификатор сообщения. Когда вы публикуете новое сообщение администратора, в эту таблицу добавляется запись для каждого пользователя администратора. Затем, когда они входят в систему, вы просто выбираете все строки admin_message_queue, где ID пользователя = зарегистрированный пользователь.

Чтобы избавиться от сообщения, достаточно просто нажать кнопку закрытия, чтобы вызвать AJAX-вызов для метода на сервере, который принимает идентификатор сообщения. Этот метод будет удален из admin_message_queue, где идентификатор сообщения = опубликованное сообщение, а идентификатор пользователя = идентификатор пользователя из сеанса. Таким образом, пользователь не может удалять сообщения для кого-либо еще.

Выполнение этого таким образом избавляет вас от необходимости хранить ряды просматриваемых сообщений. Зачем немного переключать, чтобы скрыть это для кого-то? В конечном итоге вы будете хранить большое количество данных, которые больше не используются.

Обновлено после обновления вопроса: Извините, я думал, что вы пытаетесь показать сообщения только администраторам. Вы можете сохранить ту же логику для отображения самого последнего сообщения всем пользователям. Просто есть таблица с идентификатором пользователя, текст сообщения. Всякий раз, когда вы публикуете сообщение, оно просматривает и перезаписывает текст сообщения для всех людей, у которых есть записи (люди, которые не скрыли сообщение), и добавляет строки для других людей. Когда они скрывают сообщение, удалите строку этого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...