在你喊之前ORDER BY id
,情况就大不相同了。
我被要求建立的论坛是一个留言板论坛,未注册的用户可以在其中回复和发帖。对帖子的回复缩进在被回复的帖子下方。当然,这都是无序列表中的。一个简短的例子:
就像什么Nettuts+ http://net.tutsplus.com的评论系统是这样的。在数据库中,帖子包含所有明显的信息(id、消息正文、作者、时间...)和回复 ID。 Replyid 基本上表示此帖子的回复内容。如果replyid为0,则为主帖(普通论坛中的帖子的意思。)
这就是我显示这些帖子的方式:首先,我调用一个函数(我们称之为 showPosts),它有一个名为replyid 的可选参数;默认为 0。
在 showPosts 中,我抓取所有回复 ID 等于关联数组中数据库中的参数的帖子,并填充posts
数组中的字段包含 showPosts 的结果,我将帖子的 id 传递给 showPosts。在 showPosts 的末尾,我返回该关联数组。如果这还不清楚,请看以下片段:
function showPosts($postid = 0) {
$query = query("SELECT * FROM posts WHERE replyid='$postid'");
$r = array();
$i = 0;
while (@$row = $query->fetch_assoc()) {
$r[$i] = $row;
$r[$i]['posts'] = showPosts($row['id']);
++$i;
}
return $r;
}
一切都工作得很好,就像预期的那样,但我被这个问题困扰了:当用户回复旧帖子时,我希望首先显示该帖子,就像您在论坛线程中一样。
我已经考虑过在数据库中创建一个名为lastChanged 的字段,每当用户发布新回复时,它都会沿着帖子链一直向上,并将每个lastChanged 值更改为发布时的值。然而,这似乎只是浪费内存,而且可能会浪费时间。我也想过将主线程与回复分开,但这会让事情变得更加复杂,而且我喜欢不区分线程和帖子的美妙之处,因为任何东西都可以是线程或一个帖子。
如您所知,数据库是 MySQL,后端是用 php 编写的(当然,使用 MySQLi 与 MySQL 交互。)
预先感谢,如果有任何不清楚的地方,我们深表歉意。
编辑:根据要求的数据库结构。
id | int(11)
title | varchar(100)
author | varchar(100)
body | text
replyid | int(11)
time | datetime