我有两个表,一个用于主题,一个用于回复。
+------------------+ +------------------+
| forum_topics | | forum_posts |
+------------------+ +------------------+
| topic_id | | post_id |
| topic_title | | post_content |
| topic_contents | | post_date |
| topic_date | | topic_id |
| topic_keywords | | |
+------------------+ +------------------+
我希望这样,当用户查看带有主题的页面并读取该主题时,它会被标记为该特定用户的读取。但是,如果另一个用户来回复该帖子,我希望它自上次访问后标记为新帖子或者类似的东西。
有什么想法吗?
提前致谢。
答案 0 :(得分:2)
您可以使用连接到用户和论坛帖子的查找表执行此操作,如下所示:
当用户查看论坛时,请在查找表中输入一行,如
userID, topic_id, post_id, currentTime
然后,为了确定用户是否已阅读此论坛,您可以查询该表以查看其用户ID是否显示在其中 - 这意味着他们已阅读该文章。
然后,您可以将currentTime
列与论坛/帖子中的最后一个条目进行比较,看哪哪个更好,它会告诉您用户是否看过最后一个帖子。
编辑:是的,您需要在主题和帖子中添加日期时间列(无论如何都知道发布帖子通常是好的做法)以及某些PHP / SQL:
<?php
$userUpdateTime = gmdate(); // assumed to be either dateTime or unixTimestamp of when user last red the topic/forum
$qry = '
SELECT
IF(`forum_topics`.`updateDateTime` > "'.$userUpdateTime.'", "unRead", "Read")
FROM
`forum_topics` ';
答案 1 :(得分:0)
我在论坛上使用每个成员表的每个帖子:
CREATE TABLE `forum_thread_member` (
`thread_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
`member_id` smallint(5) unsigned NOT NULL DEFAULT '0',
`last_post_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
`read_flag` bit(1) NOT NULL,
`posted_flag` bit(1) NOT NULL,
`new_flag` bit(1) NOT NULL,
`mark_flag` bit(1) NOT NULL,
`bookmark_flag` bit(1) NOT NULL,
`hidden_flag` bit(1) NOT NULL,
PRIMARY KEY (`thread_id`,`member_id`),
KEY `bookmark_flag` (`bookmark_flag`)
)
查询线程列表时,我就加入了它。如果值为NULL
,则尚未读取该线程。这可以让您确切地知道一个人阅读和参与过哪些主题。
last_post_id
非常有用,因为您可以直观地跳转并显示此人阅读的最后一个帖子。每次有人发帖时,new_flag
都设置为1
,因此很容易用于直观地确定线程列表是否有新的(未读)内容。其他标志用于管理书签,隐藏线程等。
当然这个表可能会非常大,但只要没有设置任何重要的标志(例如bookmark_flag
),就可以安全地删除旧记录。如果一个人搜索或浏览旧线程,你可以假设它们已被读取(而不是假设它们未被读取,就像你对新线程一样)。