我有我在 php/mysql 中编写的用户讨论论坛,我想知道大牌论坛如何让它向您显示哪些主题中有新帖子,通常是通过更改主题旁边的图标图像而不使用几乎任何资源?
5 回答
最简单的方法是跟踪某人上次登录的时间。当他们回来访问时,从那时起更新的所有内容显然都是“新的”。
但这有一些问题,因为注销有效地将所有项目标记为已读。
我能想到的唯一另一种方法是维护一个包含所有线程的表以及每个用户看到的该线程中的最新帖子。
user_id thread_id post_id
1 5 15
1 6 19
有了这些信息,如果线程 #5 中有一个 ID 大于 15 的帖子,那么您就知道那里有未读帖子。仅使用该页面上最新帖子的 post_id 更新此表。这意味着如果有 3 页新帖子,而用户只查看了第一页,它仍然会知道有未读帖子。
正如上面 nickf 所说,除了跟踪用户实际访问的线程之外。因此,对于该访问者来说,用户未访问过的任何内容都被视为新内容。为了更精细的控制,在用户注册之前创建的任何线程都将被忽略,并且可能在一段时间内未访问的任何线程都将被忽略。这将防止每个未访问的线程成为他们的新线程。
当然,给猫剥皮的方法有很多,根据论坛创建者的要求,上面的内容可以进行更改以适应
直流
您可以记录他们最后一次选择该主题的时间,然后查看帖子是否具有较晚的时间戳,然后是他们最后一次“点击”线程。
您可以在数据库中创建一个特殊表,其中包含 USER_ID 和 THREAD_ID 之类的列,并对 USER 和 THREAD 表进行适当的约束,以及包含 USER 和 THREAD ID 的主键。
现在,当有人打开一个线程时,您只需将该 USER-THREAD-PAIR 插入到该特殊表中。
在您的线程列表中,您现在可以简单地将该表外连接到适合您使用的内容。如果您的新表在任何特定位置包含 NULL,则该线程未读。这将启用如下列表:
- 所有带有“未读”标记的线程
- 所有未读线程
- 用户 XY 读取的线程
如果您在此表中添加日期列,您可以做更多有趣的事情。
只需留意您的键和索引,以防止对性能造成太大的负面影响。尝试仅通过将 USER-THREAD-table 加入现有查询中来读取它。这比一直执行单个查询要快得多。
如果用户尚未读取线程,则您可以拥有一个在读取线程时获取插入的表。然后,当有人添加到线程时,您可以删除该线程表中的所有条目,从而使其对所有用户都未读。
表结构将类似于
forum_id thread_id user_id
使用主键的可选附加has_read_id
项,其他字段构成复合键。