自定义php论坛 - 显示新的/未读的帖子

Jam*_*mes 9 php mysql database forum

我用自己的PHP编写了自定义论坛脚本.我决定不使用phpbb和其他人,因为我希望我正在做的事情具有100%的灵活性.

我遇到了一个问题:

如果帖子是新的/未读的,如何向用户显示.

我想到了两个解决方案:

1)Cookies 2)数据库

我不想使用cookie,因为它们可以被用户删除,而firefox方面的东西意味着它们会被自动删除.无论哪种方式,我都不想使用cookies.

数据库导致我出现问题,因为我似乎无法将数据库结构排在脑后!我能想到的第一个解决方案是:

  • 当用户加载论坛时,请检查他们上次加载论坛的时间
  • 检查自上次查看论坛以来所有帖子
  • 在具有字段(user_id,post_id)的表中将这些值输入到数据库中.
  • 然后,当他们查看帖子时,该值将从数据库中删除

我正在考虑的问题是它是一个巨大的数据库流失.它似乎效率低下.我确定在字段中有数组的方法,但我对数组的确不太好.

任何人都可以给我一个良好的数据库设计的指示,以及任何必须与它一起使用的代码吗?它让我发疯,因为我无法想到一个对服务器来说效率高效的解决方案.

非常感谢您的帮助和帮助,

詹姆士.

小智 11

这在某种程度上是一个很好的问题,我以前从未经历过这个问题所以我只能建议你一个我无法保证其正确性的想法.

我的想法基本上是:

  1. 创建一个is_new在主题表内调用的新字段.此字段包含字符串形式的值列表,遵循特定模式.例如:5|6|12|110|2|45.每个值之间|表示已阅读主题的用户ID.

  2. 每当用户跳入论坛时,在获取返回主题列表时,您将检查该用户是否读取了每个主题,简单地通过:

    • is_new使用中爆炸字符串explode('|', $row['is_new']);
    • 现在你有一个包含值的数组,只需要检查 in_array($user['id'], $list_of_ids);
  3. 如果false,标记主题unread,否则标记它,read并将该用户的ID更新到is_new列表中.

这种方法似乎不像原始方法那么"痛苦",因为它只会检查比普通方法更多的内容,同时还可以获取主题列表.我认为如果你有很多用户,它会影响更多.

注意:您不必担心标准化问题,因为is_new包含多个值,您只能使用它来检查和更新,不需要选择.

此外,您也可以使用时间比较检查主题是否为新主题.例如,如果一个主题持续4周并且用户没有阅读它,那么即使它未读,它也会返回旧的(这有意义不是吗?就像报纸一样).我想你能做到这一点,确实很容易.

这种方法特别适用于相当多的论坛软件,因为它很快且更有意义.请记住,浏览器最初支持您确定读/未读主题,即如果访问主题的超链接的颜色将被更改.现在它又回到了Cookie解决方案.我不担心用户删除他们的cookie.这很少发生,并且用户不会因为read主题unread在删除cookie后转变而死亡.

相当开放的话题不是吗?希望这可以帮助 (:

  • 我已成功将该功能添加到网站,它的工作非常精彩.我决定添加一个"新帖子"按钮,以便人们点击该按钮并查看新帖子,而不是通过突出列表中的各个帖子在服务器上添加更多消耗.非常感谢你的帮助 (2认同)

Jus*_*ᚄᚒᚔ 5

许多较大的论坛软件使用跟踪表来跟上谁读过什么,这样的事情(大大简化):

CREATE TABLE topic_tracking (
    user_id INT NOT NULL,
    topic_id INT NOT NULL,
    last_visit DATETIME NOT NULL,
    PRIMARY KEY (user_id, topic_id)
)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此表上的联接来检查您正在显示的帖子是否已被读取.由于你将分页你的线程,这应该产生相对较少的额外查询(取决于你每页显示的帖子数).

当用户访问该线程时,请使用其访问的时间戳更新此跟踪表.然后在显示您的线程链接时,检查此表以查看它们的last_visit是否早于线程中的最后一个帖子.这也可以让你显示"更新"的线程,而不仅仅是"新的"线程.