【问题标题】:How do forums show you unread topics?论坛如何显示未读主题?
【发布时间】:2011-01-01 03:05:43
【问题描述】:

我有我用 php/mysql 编写的用户讨论论坛,我想知道大牌论坛如何让它向您显示哪些主题中有新帖子,通常通过更改主题旁边的图标图像而不使用几乎没有资源?

【问题讨论】:

    标签: php mysql forums


    【解决方案1】:

    最简单的方法是跟踪某人上次登录的时间。当他们回来访问时,从那时起更新的所有内容显然都是“新的”。

    但这有一些问题,因为注销有效地将所有项目标记为已读。

    我能想到的唯一其他方法是维护一个表格,其中包含所有线程和每个用户看到的线程中的最新帖子。

    user_id   thread_id   post_id
          1           5        15
          1           6        19
    

    有了这些信息,如果线程 #5 中有一个 ID 大于 15 的帖子,那么您就知道那里有未读帖子。仅使用该页面上最新帖子的 post_id 更新此表。这意味着如果有 3 页新帖子,而用户只查看了第一页,它仍然会知道有未读帖子。

    【讨论】:

    • 当然,困难的方法是记录每个用户对每个线程的每次访问。
    • 我认为大牌论坛也与为此使用 cookie 有关,因此没有一个庞大的数据库记录表和仅用于此功能的读/写
    • '如果我更换电脑并且论坛告诉我一切都是新的,那将是一个巨大的 PITA...
    • 是的,我得看看一些论坛并研究他们是如何做到的
    • @BlueRaja-DannyPflughoeft 更大的问题是在论坛或类别索引页面上尝试将这些信息汇总到类别中。
    【解决方案2】:

    正如上面 nickf 所说,除了跟踪用户实际访问的线程之外。因此,对于该访问者来说,用户未访问过的任何内容都被视为新内容。为了更精细的控制,在用户注册之前创建的任何线程都将被忽略,并且可能在一段时间内未访问的任何线程都将被忽略。这将防止每个未访问的线程成为他们的新线程。

    当然,给猫剥皮的方法有很多,根据论坛创建者的要求,上面的内容可以更改以适应

    直流

    【讨论】:

    • 还有像 vbulletin 和 phpbb 这样的论坛,它们将允许您单击链接并将每个主题设置为已读
    【解决方案3】:

    您可以记录他们最后一次选择该主题的时间,然后查看帖子是否具有较晚的时间戳,然后是他们最后一次“点击”线程。

    【讨论】:

      【解决方案4】:

      您可以在数据库中创建一个特殊的表,其中包含 USER_ID 和 THREAD_ID 等列,并对您的 USER 和 THREAD 表进行适当的约束,以及包含 USER 和 THREAD ID 的主键。

      现在,当有人打开一个线程时,您只需将该 USER-THREAD-PAIR 插入到该特殊表中即可。

      在您的线程列表中,您现在可以简单地将该表外连接到适合您使用的内容。如果您的新表在任何特定位置包含 NULL,则该线程未读。这将启用如下列表:

      • 带有“未读”标记的所有主题
      • 所有未读线程
      • 用户 XY 读取的线程

      如果您在此表中添加日期列,您可以做更多有趣的事情。

      只需注意您的键和索引,以防止对性能造成太大的负面影响。尝试仅通过将 USER-THREAD-table 加入现有查询中来读取它。这比一直执行单个查询要快得多。

      【讨论】:

        【解决方案5】:

        如果用户尚未读取线程,则您可以拥有一个在读取线程时获取插入的表。然后,当有人添加到线程时,您可以删除该线程表中的所有条目,从而使所有用户都无法读取它。

        表格结构类似于

        forum_id thread_id user_id
        

        使用可选的额外 has_read_id 作为主键,其他字段构成复合键。

        【讨论】:

        • 是的,我正在考虑,但希望有一个更好的解决方案(更少的读写)我将研究 vbulletin 和 phpbb 以及其他工作如何可能会揭示一个更好的解决方案跨度>
        • phpBB 必须做一些不同的事情。当我登录elitebastards.com 并查看新帖子列表(自我上次访问以来的新帖子)时,在我的会话超时后,新帖子列表为空,即使我没有访问列表中的所有线程.但是,如果我去寻找它们,这些线程仍然被标记为未读。
        猜你喜欢
        • 2012-10-28
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多