Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将论坛线程标记为已读? 我正在研究一个自定义论坛,并且想知道人们认为如何将线程标记为读取的最佳方法。_Php - Fatal编程技术网

Php 将论坛线程标记为已读? 我正在研究一个自定义论坛,并且想知道人们认为如何将线程标记为读取的最佳方法。

Php 将论坛线程标记为已读? 我正在研究一个自定义论坛,并且想知道人们认为如何将线程标记为读取的最佳方法。,php,Php,我想显示一个帖子图标的线程,如果线程还没有被阅读它有一个未读的图标和主题标题是粗体。如果已阅读,则主题标题为普通字体,帖子图标变为已阅读图标 最好的方法是在用户会话中存储他们已查看的线程,并将其设置为将所有超过48小时的线程标记为已读 谢谢 在我脑海中,我会保留一个单独的表,其中包含userId、threadId和lastVisted日期/时间。当用户查看线程时,只需添加/更新适当的userId/ThreadId记录 然后,当访问者查看一个线程时,您知道在用户的lastVistedDate之后发

我想显示一个帖子图标的线程,如果线程还没有被阅读它有一个未读的图标和主题标题是粗体。如果已阅读,则主题标题为普通字体,帖子图标变为已阅读图标

最好的方法是在用户会话中存储他们已查看的线程,并将其设置为将所有超过48小时的线程标记为已读


谢谢

在我脑海中,我会保留一个单独的表,其中包含userId、threadId和lastVisted日期/时间。当用户查看线程时,只需添加/更新适当的userId/ThreadId记录


然后,当访问者查看一个线程时,您知道在用户的lastVistedDate之后发布的任何帖子都是新的,而且很明显,如果没有LastVisted date,您知道一个线程中的所有帖子都是新的。

维护一个用户上次访问线程的日期时间表

查看的线程

列:用户id、线程id、日期时间

还要确保跟踪上次更新线程的时间

当用户打开线程时

replace into viewed_thread ( user_id, thread_id, datetime ) values( $user_id, $thread_id, now() )

现在,在列出线程时,您可以检查用户会话中用户上次访问该线程的日期时间。如果上次查看的日期时间早于上次更新线程的时间,则它是“新的”

创建第二个表,例如:

thread_member: thread_id, member_id, read_flag, posted_flag, bookmarked_flag
基本上,任何特定于该成员的内容和线程都可以进入其中。当拉动线程列表时,左连接该表。如果read_标志为
0
NULL
,则它是新的

SELECT * FROM thread t
LEFT JOIN thread_member tm ON t.id=tm.thread_id AND tm.member_id=$member_id
WHERE t.id=$thread_id
每当有人在线程中发布消息时,只需运行以下查询:

UPDATE thread_member SET read_flag=0 WHERE thread_id=$thread_Id
posted_标志可用于确定此人是否在线程中写入消息

bookmarked_标志可用于确定用户是否将线程添加到书签中


为了保持表整洁,可以截断所有未设置任何重要标志的旧记录。在本例中,您可以删除所有超过X天/周/月且未设置书签标志的记录。

谢谢。表格会不会变得有点长?表格确实会变大,但是你可以在任何合适的时间间隔截断它。在任何中小型站点上,您都应该能够非常自由,假设您已经准备好了索引,并且有足够的RAM来提高效率,等等。我可以想象,表的文件大小不会太大,我们只讨论3个小字段-但是,它的记录数量可能会变大。只要你没有把所有的记录都拉进去,你就应该没事了。如果你需要拉一个线程列表,简单的
选择thread\u id,lastVisted from threadview,其中thread\u id in(x1,x2,x3)和user\u id=xxxx
虽然这似乎是一种智能的方法,但我想知道每次发帖子时对(可能的)数百条记录执行更新会带来什么好处,而不是进行数据比较。你应该已经知道最后一篇帖子是什么时候了——在我看来,你基本上只是用int替换了一个日期,但是在这个过程中做了更多的工作。你真的在减少桌子的尺寸吗?这是一个公平的观点,但考虑到论坛的回复可能不是很频繁,我怀疑这样做会有任何重大的惩罚。(另外,添加
和read_flag=1
会限制更新的次数。)我更喜欢这个标志,因为它与其他类型的数据匹配(甚至可以压缩成一个位字段),同时准确地描述了它的用途,但如果有人更喜欢时间戳,我不会反对它。