如何在PHP Mysql中实现只有一级深度注释系统

时间:2013-04-10 11:35:56

标签: php mysql database-design

我想在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评论系统一样)

任何建议??

3 个答案:

答案 0 :(得分: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*/)
  )
) 

答案 1 :(得分:0)

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

要获取线程的所有注释,请使用类似的SQL查询:

select * from comments where thread_id = 'yourthread_id'

我假设q& a作为父母。

您必须主题和 的评论写入到表中,并记录它们所属的位置。

录制时不要将它们留空。

所以:

$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将每个注释收集到其相应的父级中,并通过时间戳发现它们的输入顺序......这就是数组操作,我想您可以轻松完成。

答案 2 :(得分: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) {
}
}