2010-01-13 40 views
5

我正在PHP/MySQL/jQuery构建一个社交网站。一旦用户登录我的网站,我想查询数据库并获得管理员通告(如果存在)。这将是一个消息框,显示在所有用户的页面上,但它会有一个X点击它,并不会再显示它,直到管理员发布新的宣告消息。因此,如果您从不点击X并且存在数据库中的公告消息,它将始终在您的页面上显示此消息框,但是如果您确实使用了X来关闭该框,那么您将返回到它将会出现的页面除非发布新的管理消息,否则不在那里。向特定用户显示管理员消息的最佳方式?

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

我有一个想法,如果我将额外的mysql字段添加到用户的表“admin_message”并将其标记为0,那么当我发布新的管理消息时,它会将每个用户的记录更改为1,如果管理员消息设置为1,然后显示在用户的页面上。然后,当用户点击X来隐藏盒子时,它将更新那里的用户表格行和chnage值返回0.

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

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



UPDATE

对不起,我想我的文章可能是一个有点混乱或不清晰的,究竟我的意思,因为大多数的答复迎合了信息系统,这是不是任何接近的东西。

忘记消息的话请我尝试用另一个词来解释。假设网站上有1个管理员,那是唯一可以发布消息给用户看到的管理员。用户只会看到1条消息,如果在网站的整个生命周期内发布了2352345234条消息,则无关紧要,它们只会看到1条消息,即最新消息。

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

它会像在是或否在这个页面上显示此消息一样简单。

但是,如果我决定需要发布一条新的管理消息供所有用户查看,那么即使选择隐藏并且不显示管理消息的用户仍然会看到它,直到他们选择再也不会看到它。

回答

3

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

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

更好:将某个标志存储在数据库的某处(您现在可以将其存储在admin用户表中,然后沿着该行将其分解到另一个表中)。当用户登录时,1)将此标志保存到用户的cookie或会话中,2)更新数据库,3)决定是否需要显示消息。当用户关闭消息时,更新Cookie /会话和数据库。优点:用户永远不会显示消息两次。缺点:由于需要在数据库中维护标志,因此涉及的内容稍多。

实现详细信息: 对于该标志,您可以使用已建议的消息标识,或者更有可能您已保留用户的上次登录时间戳并可以使用该标识。

0

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

要删除刚才关闭按钮的消息,将触发AJAX回调到服务器上带有消息ID的方法。该方法将从admin_message_queue中删除,其中消息ID =发布的消息ID,用户ID =会话中的用户ID。这样用户不能为其他人删除消息。

这样做可以让您不必拘泥于查看的消息行。为什么切换一下以便为某人隐藏?您最终会保留大量不再使用的数据。

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

+0

老实说,它并不那么复杂。这将是1管理员在网站上,它只会显示1条消息,这是最新的消息,这将是每个用户看到的,我只需要一种方式让用户隐藏消息框,如果他们选择从那里显示页面和一种方法让我强制隐藏框显示是否发布新消息。所以我不需要存储任何类型的用户ID,也不需要查询特殊ID的 – JasonDavis 2010-01-13 15:15:45

1

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

另一个想法是在javascript环境最后消息看到数字,但在那种情况下它会在刷新/放弃页面时重新设置(重新计算),如果它不在数据库上,用户可能会错过在最后一页加载和此刷新之间插入的消息。

或... 它可以在会议,所以你不会错过任何。当你登录时,号码被重设为某个“正常”号码,比如说:最后一条消息,或消息后(现在 - 1小时),或其他任何...

1

我会使用想法#1。我不会使用bool字段来检查用户是否已经阅读了邮件,我会使用datetime字段,并使用一些默认值。如果字段==默认,未读。阅读时,将字段设置为NOW()。

通过这种方式,您大概知道用户阅读邮件的速度有多快。

编辑:

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

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

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

EDIT2: 在回复此评论:

即使用户错过了上午消息,只有 最新的应该显示。也许我 misunderstaning但听起来你 是说给basicly邮件标记 阅读100000次是10万个用户 单击X一样,我认为它应该是 更多的用户表,显示或不 显示消息框,不在个人 基础上

你的理论中有些东西不是本地化的。您想要将“显示/不显示”保存为设置,但您仍然想要显示该消息。你怎么知道何时推翻用户设置,何时不记住系统是否向用户显示了消息? 即使您只想显示一次,您也需要在数据库中的一个字段(在消息级别)存储系统是否向用户显示消息。

+0

即使用户错过了消息,也只会显示最新的消息。也许我误会了,但它听起来像你说基本上标记消息读取100,000次是100,000用户点击X,我认为它应该更多地在用户表上,显示或不显示消息框,而不是个别 – JasonDavis 2010-01-13 16:57:06

+0

它不是在消息级别上,可以让它更容易理解,让我们假装只有1条消息发了出去,我只是更新消息/评论/通知,无论你喜欢怎么称呼它。当我更新它时,每个用户都应该在页面上看到它,即使他们选择不看这些。隐藏它的设置只是为了隐藏它,直到我更新/发布一个新的。我想我现在知道了,我会添加一个设置字段到数据库来显示或不显示主页通知/消息 – JasonDavis 2010-01-14 15:52:47

+0

感谢试图了解我在说什么,我知道有时很难解释的事情 – JasonDavis 2010-01-14 15:54:52

1

您正在为用户保留登录时间吗?像last_login datetime一样?

因此,获取所有消息where date_created> = last_login。显示它们,然后将last_login时间更新为now()。

相关问题