向某些用户显示管理员消息的最佳方式?

时间:2010-01-13 15:03:00

标签: php jquery mysql

我正在使用PHP / MySQL / jQuery构建社交网站。一旦用户登录到我的网站,我想查询数据库并获得管理员通知(如果存在)。这将是一个消息框,在页面上显示给所有用户,但它将有一个 X 点击它,并且在管理员发布新的公告消息之前不再显示它。因此,如果您从未单击过X并且数据库中存在公告消息,它将始终在您的页面上显示此消息框,但是如果您确实cli9ck X关闭该框,那么您将返回到该页面除非有新的管理员消息,否则不在那里。

我知道有几种方法可以做到这一点,但我正在寻找最有效的方法。

我有一个想法,如果我在用户的表“admin_message”上添加一个额外的mysql字段并将其标记为0,那么当我发布新的管理员消息时,它会将每个用户的记录更改为1,如果是管理员消息设置为1,然后显示在用户的页面上。然后,当用户单击X以隐藏该框时,它将更新用户表行并将该值重新设置为0.

我的另一个想法是使用cookie来检查用户是否选择隐藏消息,我认为这会更快但可能不那么好,因为用户可以使用不同的计算机登录并且如果显示新消息,他们可能不会马上看到它。

所以我只是想知道使用额外的数据库字段是不是一个坏主意?如果我有1,000,000个用户,当我发布新的管理员消息时,我需要更新1,000,000行以确保每个人都能看到该消息。有没有更好的办法?此外,一旦用户登录我的网站,我将使用会话来存储他们看到或隐藏消息的值,而不是在每次加载页面时查看数据库。



更新

很抱歉,我认为我的帖子可能有点令人困惑或者不清楚我究竟是什么意思,因为大多数回复都是针对一个消息系统,而这个系统并不接近。

请忘记留言,我会尝试用不同的词来解释。假设网站上有1个管理员,这是唯一一个可以向用户发布消息的管理员。用户只会看到1条消息,如果在网站的生命周期内发布了2352345234条消息,则无所谓,它们只会看到1条消息,即最新消息。

现在,一些登录并在页面上看到此消息“div”的用户可能会厌倦查看它,因此他们将能够隐藏它再次显示。

在该页面上显示此消息将是“是”或“否”。

但是,如果我决定要为所有用户发布新的管理员消息,那么即使是选择隐藏但未显示管理员消息的用户仍会再次看到它,直到他们选择再也看不到它为止。< / p>

5 个答案:

答案 0 :(得分:3)

两个简单的解决方案如下:

好:检查用户cookie,如果它包含一个标志,指示显示的消息不显示消息,否则显示它。当用户关闭它时,更新cookie。优点:绝对简单。缺点:用户可能会看到相同的消息两次,具体取决于他们是否清除了Cookie或从其他计算机登录。

更好:在某个地方的数据库中存储一个标志(你现在可以将它存储在admin用户表中,然后将它分成另一个表)。当用户登录时,1)将此标志保存到用户的cookie或会话中,2)更新数据库,3)确定是否需要显示该消息。当用户关闭消息时,更新cookie /会话和DB。优点:用户永远不会两次显示该消息。缺点:稍微需要在db中维护标志。

实施细节: 对于该标志,您可以使用已建议的消息ID,或者您可能已经保留用户的上次登录时间戳并且可以使用该消息。

答案 1 :(得分:1)

每个用户都可以拥有last_message_seen ,因此您必须为您的用户查询“新”消息(message_id&gt; last_message_seen)。如果您[X]关闭(或超时),那么您的javascript可以检查新消息等等......

另一个想法是在javascript环境中看到最后一条消息显示的数字,但在这种情况下,当您刷新/放弃页面时,它将被重置(重新计算),如果它没有打开数据库,您的用户可能会错过在上次加载和刷新之间插入的消息。

或者...... 它可以在会话中,所以你不要错过任何一个。当您登录时,该号码将重置为某个“正常”号码,例如:最后一条消息,或者(现在 - 1小时)之后的消息,或者其他...

答案 2 :(得分:1)

我会用#1的想法。我不会使用bool-field来检查用户是否已阅读该消息,我将使用datetime-field,并使用一些默认值。如果field == default,则未读。读取时,设置字段NOW()。

通过这种方式,您可以大致了解用户阅读邮件的速度。

修改

编辑后,我仍然使用相同的机制。该消息需要一个字段来查明是否已读取。如果用户单击X(关闭),请更新数据库并将消息标记为已读。

如果管理员发布了新消息,则会弹出。

您还需要一个创建日期时间,因为如果用户没有关闭上一条消息,并且管理员发布了新消息,则只能显示最新消息。

<强> EDIT2: 在回复此评论时:

  

即使用户错过了上午的消息,也只是   应该显示最新的。也许我是   误会,但听起来像你   正在说基本上标记一条消息   读取100,000次是100,000个用户   点击X,我认为应该是   更多关于用户表,显示或不显示   显示消息框,而不是个人   基础

在你的理论中,某些东西不是地方性的。您希望将“显示/不显示”保存为设置,但无论如何都要显示消息。你怎么知道何时推翻用户设置,何时不记得系统是否向用户显示了消息? 即使您只想显示一次,您也需要数据库中的一个字段(在消息级别)来存储系统是否向用户显示消息。

答案 3 :(得分:1)

您是否为用户保留了登录时间?就像last_login datetime?

所以获取date_created&gt; = last_login的所有消息。显示它们,然后将last_login时间更新为now()。

答案 4 :(得分:0)

我建议使用admin_message_queue表。它将具有消息正文,用户ID和消息ID。当您发布新的管理员消息时,它将为该表的每个管理员用户添加一条记录。然后,当他们登录时,您只需选择所有admin_message_queue行,其中用户ID =登录用户。

要删除消息,您只需关闭按钮就会触发AJAX回调到服务器上获取消息ID的方法。该方法将从admin_message_queue中删除,其中消息ID =发布的消息ID和用户ID =会话中的用户ID。这样,用户就无法删除其他人的邮件。

这样做可以使您不必查看已查看邮件的行。为什么要为某人隐藏它?你最终会保留大量不再使用的数据。

更新问题后更新: 抱歉,我以为你试图向管理员显示消息。您也可以保持同样的逻辑,以便向所有用户显示最新消息。只需要一个包含userID,消息文本的表。每当您发布消息时,它都会通过并覆盖所有记录仍然存在的人(未隐藏消息的人)的消息文本,并为其他人添加行。当他们隐藏邮件时删除该用户的行。