PHP - 与父级一起创建评论列表

标签 php mysql codeigniter

我有这样的表结构:

id_comment
body
date_created
date_updated    
user_id
parent_id

现在这个函数:

public function comments_list($comments)
    {
        $comments_list = "";
        foreach ($comments as $c) :
            if($c['parent_id'] == 0) :
                $comments_list .= '<div class="comment level-0">';
                $comments_list .= $c['body'];
                $comments_list .= '</div>';
            endif;
        endforeach;


    }

$comments 是包含所有评论的数组(二维数组)。 $c['parent_id'] == 0 是父评论。子评论的 parent_id 设置为父评论的 ID。 如何创建具有父/子关系的评论列表?

评论结构:

array(5) {
  [0]=>
  array(9) {
    ["id_comment"]=>
    string(1) "1"
    ["body"]=>
    string(532) "Odio lectus hac odio ultrices vel diam hac elementum amet et scelerisque porttitor nunc elementum. Sit nunc turpis! Porttitor, odio massa nisi turpis porttitor aliquam aliquam proin! Tincidunt dapibus adipiscing sagittis adipiscing odio velit eros nisi tortor porttitor ut elit enim amet egestas porta. Massa. Nec tortor aliquet sed ultrices dignissim massa! Adipiscing tortor, pulvinar ultricies, lectus adipiscing sagittis, a tortor sit magna integer. Scelerisque hac amet amet habitasse et turpis integer nisi sagittis ridiculus."
    ["date_created"]=>
    string(19) "2014-07-01 00:00:00"
    ["date_updated"]=>
    string(19) "2014-07-02 02:34:51"
    ["post_id"]=>
    string(1) "4"
    ["user_id"]=>
    string(1) "1"
    ["parent_id"]=>
    string(1) "0"
    ["good_vote"]=>
    string(1) "0"
    ["bad_vote"]=>
    string(1) "0"
  }
  [1]=>
  array(9) {
    ["id_comment"]=>
    string(1) "2"
    ["body"]=>
    string(532) "Odio lectus hac odio ultrices vel diam hac elementum amet et scelerisque porttitor nunc elementum. Sit nunc turpis! Porttitor, odio massa nisi turpis porttitor aliquam aliquam proin! Tincidunt dapibus adipiscing sagittis adipiscing odio velit eros nisi tortor porttitor ut elit enim amet egestas porta. Massa. Nec tortor aliquet sed ultrices dignissim massa! Adipiscing tortor, pulvinar ultricies, lectus adipiscing sagittis, a tortor sit magna integer. Scelerisque hac amet amet habitasse et turpis integer nisi sagittis ridiculus."
    ["date_created"]=>
    string(19) "0000-00-00 00:00:00"
    ["date_updated"]=>
    string(19) "2014-07-02 02:34:54"
    ["post_id"]=>
    string(1) "4"
    ["user_id"]=>
    string(1) "1"
    ["parent_id"]=>
    string(1) "2"
    ["good_vote"]=>
    string(1) "0"
    ["bad_vote"]=>
    string(1) "0"
  }
  [2]=>
  array(9) {
    ["id_comment"]=>
    string(1) "3"
    ["body"]=>
    string(532) "Odio lectus hac odio ultrices vel diam hac elementum amet et scelerisque porttitor nunc elementum. Sit nunc turpis! Porttitor, odio massa nisi turpis porttitor aliquam aliquam proin! Tincidunt dapibus adipiscing sagittis adipiscing odio velit eros nisi tortor porttitor ut elit enim amet egestas porta. Massa. Nec tortor aliquet sed ultrices dignissim massa! Adipiscing tortor, pulvinar ultricies, lectus adipiscing sagittis, a tortor sit magna integer. Scelerisque hac amet amet habitasse et turpis integer nisi sagittis ridiculus."
    ["date_created"]=>
    string(19) "0000-00-00 00:00:00"
    ["date_updated"]=>
    string(19) "2014-07-02 02:34:56"
    ["post_id"]=>
    string(1) "4"
    ["user_id"]=>
    string(1) "1"
    ["parent_id"]=>
    string(1) "3"
    ["good_vote"]=>
    string(1) "0"
    ["bad_vote"]=>
    string(1) "0"
  }
  [3]=>
  array(9) {
    ["id_comment"]=>
    string(1) "4"
    ["body"]=>
    string(532) "Odio lectus hac odio ultrices vel diam hac elementum amet et scelerisque porttitor nunc elementum. Sit nunc turpis! Porttitor, odio massa nisi turpis porttitor aliquam aliquam proin! Tincidunt dapibus adipiscing sagittis adipiscing odio velit eros nisi tortor porttitor ut elit enim amet egestas porta. Massa. Nec tortor aliquet sed ultrices dignissim massa! Adipiscing tortor, pulvinar ultricies, lectus adipiscing sagittis, a tortor sit magna integer. Scelerisque hac amet amet habitasse et turpis integer nisi sagittis ridiculus."
    ["date_created"]=>
    string(19) "0000-00-00 00:00:00"
    ["date_updated"]=>
    string(19) "2014-07-02 02:34:59"
    ["post_id"]=>
    string(1) "4"
    ["user_id"]=>
    string(1) "0"
    ["parent_id"]=>
    string(1) "1"
    ["good_vote"]=>
    string(1) "1"
    ["bad_vote"]=>
    string(1) "0"
  }
  [4]=>
  array(9) {
    ["id_comment"]=>
    string(1) "5"
    ["body"]=>
    string(532) "Odio lectus hac odio ultrices vel diam hac elementum amet et scelerisque porttitor nunc elementum. Sit nunc turpis! Porttitor, odio massa nisi turpis porttitor aliquam aliquam proin! Tincidunt dapibus adipiscing sagittis adipiscing odio velit eros nisi tortor porttitor ut elit enim amet egestas porta. Massa. Nec tortor aliquet sed ultrices dignissim massa! Adipiscing tortor, pulvinar ultricies, lectus adipiscing sagittis, a tortor sit magna integer. Scelerisque hac amet amet habitasse et turpis integer nisi sagittis ridiculus."
    ["date_created"]=>
    string(19) "0000-00-00 00:00:00"
    ["date_updated"]=>
    string(19) "2014-07-02 02:35:02"
    ["post_id"]=>
    string(1) "4"
    ["user_id"]=>
    string(1) "1"
    ["parent_id"]=>
    string(1) "0"
    ["good_vote"]=>
    string(1) "0"
    ["bad_vote"]=>
    string(1) "0"
  }
}

最佳答案

您需要的基本查询是这样的:

SELECT * FROM `comments` WHERE `parent_id` = 0 ORDER BY `date_created` DESC

假设您要查找的评论的父级 ID 为 0

首先,只获取“root”注释:

SELECT * FROM `comments` WHERE `parent_id` IS NULL ORDER BY `date_created` DESC

假设“根”评论的父 ID 为空值(您需要一些东西来将其与子评论区分开来)。

编辑

好的,我想我明白你的问题是什么;)如果没有,请澄清!

您应该采取 2 个步骤:1)获取根注释并迭代它们,同时将它们插入到 DOM 中。 2)在每次迭代时,获取“子注释”并迭代它们,将它们插入到 DOM 中

如果你想要多级注释,你应该使用递归。

示例:

$query = 'SELECT * FROM `comments` WHERE `parent_id` IS NULL ORDER BY `date_created` DESC';
$comments = fetch_results_with_your_own_database_function($query);

foreach($comments as $comment) {
    echo '<div class="comment">';
    echo $comment->body;
    echo subCommentList($comment->id);
    echo '</div>';
}

function subCommentList($parent_id) {
    $query = 'SELECT * FROM `comments` WHERE `parent_id` = '. $parent_id .' ORDER BY `date_created` DESC';
    $comments = fetch_results_with_your_own_database_function($query);
    foreach($comments as $comment) {
        echo '<div class="subcomment">';
        echo $comment->body;
        echo subCommentList($comment->id);
        echo '</div>';
    }
}

请注意,该函数正在使用当前 id 作为下一次调用的父级来调用自身。每次它都会在您的列堆栈中更深入(请原谅我对术语的错误使用)。

警告在查询中按原样包含 ID 是非常不安全的。我相信你使用了一个好的数据库和准备好的语句等。如果你还没有使用它,请谷歌

关于PHP - 与父级一起创建评论列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515105/

相关文章:

php - Wordpress - 更改 function.php 中的插件选项

php - SSL 安全站点上 Magento cookie 中的 'secure' 标记在哪里?

php - 如何通过连接两个表来显示所有结果和空值?

5.7 版与 5.6 版的 MySQL 性能

php - 无法使用 Codeigniter 中提供的设置连接到您的数据库服务器

php - 从多个表中选择时,如何在分组之前实现排序

PHP 正则表达式用于验证某些数字格式

mysql - 如何从 ComboBox 返回对象

php - 在 PHP 中使用内联查询与存储过程

javascript - 如何隐藏和显示带有选中复选框的表列