0

我只想在 php 中制作一级深度评论系统,就像 stackoverflow 评论系统一样。

我创建了一个包含以下字段的评论表

  comment_id int(11) (PRIMARY KEY)
  parent_id int(11)
  thread_id int(11) (FOREIGN KEY)
  title varchar(400)
  body varchar(400)
  date_comment timestamp 
  user_name varchar(100)

我正在使用此查询检索父评论

SELECT * FROM comments WHERE thread_id = {$thread_id} 
AND parent_id IS NULL

但我还需要按照先到父评论然后是所有子评论的顺序检索所有子评论,依此类推..(就像 Stackoverflow 评论系统一样)

有什么建议吗??

4

3 回答 3

2

如果没有任何特殊键,您无法订购所有数据。

最简单的方法是选择所有评论和线程:

SELECT
 * 
FROM
 comments 
WHERE
 thread_id = {$thread_id} 

并对结果数组进行简单的操作:

$array = array();
foreach($result as $row)
{
    if(!$row['thread_id']){
        $array[$row['id']]=array();
        $array[$row['id']]['DATA'] = $row;
        continue;
    }

    $array[$row['id']][$row['id']] = $row;
}

您将拥有如下数组:

Array(
  /*thread==>*/          [11] => Array(
      /*thread data==>*/   [DATA] => Array(/*with thread data*/)
      /*comment==>*/       [12] => Array(/*with data*/)
      /*comment==>*/       [13] => Array(/*with data*/)
  )
) 
于 2013-04-10T12:09:12.623 回答
0
<?php 

$a = mysql_query("Select * From comments where thread_id = {$thread_id} AND parent_id IS NULL");

while($row= mysql_fetch_array($a)) {
  $b = mysql_query("Select * From comments, where thread_id = ($thread_id} AND parent_id = " . $row['comment_id'] .";");
  while($row2 = mysql_fetch_array($b) {
}
}
于 2013-04-10T11:50:25.950 回答
0

假设您只在评论表中记录评论......

要获取线程的所有注释,请使用如下 sql 查询:

select * from comments where thread_id = 'yourthread_id'

我假设 q & a 作为父母。

您必须评论连同他们的线程和父 ID写到 表中,记录他们所属的位置。

录制时不要让它们为空。

所以:

$query  = "select * from comments where thread_id = '$threadId'";
$result = mysqli_query($query);
if(!$result){
   echo('Failure : '.mysqli_errno());
   exit(0);
}
$comments = [];
while(true){
    $row = mysqli_fetch_assoc($result);
    if(!$row)break;
    $comments[] = $row;
}

现在你有 $comments 数组,其中填充了属于该线程的评论。

每个元素都具有数据库记录的结构:

 $comment[0]['comment_id'] etc...

现在通过遍历该数组,您可以通过其 parent_id 将每个评论收集到其适当的父项中,并通过时间戳发现它们的条目顺序......这是数组操作,我想您可以轻松完成。

于 2013-04-10T11:41:01.763 回答