我自己使用 php 编写了一个自定义论坛脚本。我决定不使用 phpbb 和其他工具,因为我希望我所做的事情具有 100% 的灵活性。
不过我遇到了一个问题:
如何向用户显示帖子是否是新的/未读的。
我想到了两种解决方案:
1) 饼干
2)数据库
我不想使用 cookie,因为它们可以被用户删除,而 Firefox 方面意味着它们会被自动删除。不管怎样,我不想使用cookie。
数据库给我带来了问题,因为我似乎无法在脑海中对数据库结构进行排序!我能想到的第一个解决方案是:
- 当用户加载论坛时,检查他们上次加载论坛的时间
- 检查自上次查看论坛以来发布的所有帖子
- 将这些值输入到数据库中包含字段(user_id、post_id)的表中。
- 当他们查看帖子时,该值将从数据库中删除
我想到的问题是这是一个巨大的数据库消耗。看起来效率很低。我确信字段中存在带有数组的方法,但我对数组并不是那么擅长。
谁能告诉我一个良好的数据库设计以及与之相关的任何代码?这让我抓狂,因为我想不出对服务器有效且高效的解决方案。
预先非常感谢您的帮助和帮助,
James.
这在某种程度上是一个好问题,我以前从未经历过这种情况,所以我只能向你建议一个想法,我不能保证其正确性。
我的想法基本上是:
创建一个新字段,名为is_new
在主题表内。该字段包含遵循特定模式的字符串形式的值列表。例如:5|6|12|110|2|45
。之间的每个值|
代表已阅读该主题的用户ID。
-
每次用户跳转到论坛时,在获取返回主题列表时,您将检查该用户是否阅读了每个主题,简单地说:
- 分解字符串
is_new
using explode('|', $row['is_new']);
- 现在你有一个包含值的数组,只需要检查
in_array($user['id'], $list_of_ids);
If false
,标记主题unread
,否则标记为read
并将该用户的 ID 更新为is_new
list.
这种方法看起来比原来的方法更“痛苦”,因为它只比普通方法进行更多的检查,并且与您获取主题列表的同时进行。我认为如果你有大量用户,它的影响会更大一些。
Note:你不必担心规范化的问题,因为is_new
包含多个值,您只用它来检查和更新,不需要选择。
此外,您还可以使用时间比较来检查主题是否是新的。例如,如果一个主题持续了 4 周并且用户没有阅读它,那么即使它没有阅读,它也会返回旧的(这很有意义不是吗?就像报纸一样)。我认为你能够做到这一点,确实很容易。
这种方法特别被不少论坛软件所采用,因为它速度快且更有意义。请记住,浏览器最初支持您确定已读/未读主题,即如果访问该主题,超链接的颜色将会更改。现在又回到了Cookies解决方案。我不担心用户删除他们的cookie。这种情况很少发生,用户不会仅仅因为read
话题转向unread
他们删除 cookie 后。
这是一个开放式的话题不是吗?希望这可以帮助 (:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)