【发布时间】:2011-08-11 22:37:42
【问题描述】:
我有一个 cmets 系统。每个评论都可能收到回复,每个回复都可能收到回复,令人作呕。
因此,我的数据库包含一个名为“cmets”的表,其中包含以下重要字段:
id
text
reply_to
...在reply_to 下,当然是作为回复的评论的ID。
所以现在,问题很简单:我如何显示所有的 cmets,但要知道在每个评论之后必须对它进行回复,并且在每个回复之后必须对回复进行回复,等等?
我尝试最多的,以及我不断重复的,是这样的:
$query = mysql_query("SELECT * FROM comments WHERE reply_to=0");
while ($comment = mysql_fetch_array($query))
include("comment.php");
在comment.php中,我拥有的是:
foreach ($comment as $key = $value) $$key = $value;
echo $text;
echo "<div style='margin-left:30px;'>"; //A margin for a little indent
$subquery = mysql_query("SELECT * FROM comments WHERE reply_to=$id");
while ($comment = mysql_fetch_array($subquery))
include("comment.php");
echo "</div>";
但是如果我正确地复制了我的代码的本质,问题是:在第一个回复被回显之后,它继续到第一个回复的第一个回复,然后是第一个回复的第一个回复第一个回复,但循环永远不会得到任何第二个回复。所以举个例子,假设表有 3 个 cmets,每个 cmets 有 3 个回复,每个有 3 个回复,等等,上面的代码会输出:
Comment
First reply
First second-order reply
First third-order reply
...
我希望我已经解释得足够清楚了。 inb4:我无法向表中添加新列。
【问题讨论】:
-
您需要将代码打包到一个函数中,并使其递归。 stackoverflow.com/questions/2648968/…
-
如果不出意外,上床睡觉,醒来后的几个小时内不要想代码。如果您整天都在为此苦苦挣扎,请离开一会儿。
-
循环访问数据库也不是一个好主意。 id 在 1 个查询中获取所有相关的 cmets,然后尝试使用循环/递归显示它们。
-
使用心理计算机科学技能我可以说这是递归的经典案例
标签: php while-loop