0

phpを使ってスレッド化されたコメントシステムを実装しようとしていますが、すでに書かれているものを見つけましたが、その使い方が正確にわかりません。クラスにまったく慣れていないので、誰かが私を説明するのを手伝ってくれるかどうか疑問に思いました。コードを使用します。以下のコードはウェブサイトからのものです

http://www.jongales.com/blog/2009/01/27/php-class-for-threaded-comments/

クラスのコードは次のとおりです。

class Threaded_comments
{

    public $parents  = array();
    public $children = array();

    /**
     * @param array $comments
     */
    function __construct($comments)
    {
        foreach ($comments as $comment)
        {
            if ($comment['parent_id'] === NULL)
            {
                $this->parents[$comment['id']][] = $comment;
            }
            else
            {
                $this->children[$comment['parent_id']][] = $comment;
            }
        }
    }

    /**
     * @param array $comment
     * @param int $depth
     */
    private function format_comment($comment, $depth)
    {
        for ($depth; $depth > 0; $depth--)
        {
            echo "\t";
        }

        echo $comment['text'];
        echo "\n";
    }

    /**
     * @param array $comment
     * @param int $depth
     */
    private function print_parent($comment, $depth = 0)
    {
        foreach ($comment as $c)
        {
            $this->format_comment($c, $depth);

            if (isset($this->children[$c['id']]))
            {
                $this->print_parent($this->children[$c['id']], $depth + 1);
            }
        }
    }

    public function print_comments()
    {
        foreach ($this->parents as $c)
        {
            $this->print_parent($c);
        }
    }

}

このサイトによると、使用例は次のようになります。

$comments = array(  array('id'=>1, 'parent_id'=>NULL,   'text'=>'Parent'),
                    array('id'=>2, 'parent_id'=>1,      'text'=>'Child'),
                    array('id'=>3, 'parent_id'=>2,      'text'=>'Child Third level'),
                    array('id'=>4, 'parent_id'=>NULL,   'text'=>'Second Parent'),
                    array('id'=>5, 'parent_id'=>4,   'text'=>'Second Child')
                );

$threaded_comments = new Threaded_comments($comments);

$threaded_comments->print_comments();

しかし、ここで私は問題を抱えています。まず、データベースをどのように設定すればよいか正確にはわかりません。

現在、3行しかありません。

id
page
user
comment

そして、mysqliのプリペアドステートメントを使用してこのデータベースにクエリを実行します。おそらくこのようなもの:

$DBH = getDBH();
$q = $DBH->prepare("SELECT * FROM comments WHERE page = ?");
$q->bind_param("i", $page);
$q->execute();

しかし、どうすればこれを表示できるかわかりません。コメントが別のコメントの子であるかどうかを宣言するために、データベースに別の行を追加する必要があることはわかっています。どんな助けでも大歓迎です

4

1 に答える 1

2

テーブルに別の列を追加する必要があります。parent_id

次に、通常のようにすべてのコメントをフェッチし、それらを配列に入れてThreaded_commentsコンストラクターに渡します

$result = $mysqli->query(
    "SELECT id, parent_id, comment AS text
        FROM yourtable");

$all_results = $result->fetch_all(MYSQLI_ASSOC);
/* For MySQLi_STMT */

$q = $DBH->prepare("SELECT id, parent_id, comment FROM comments WHERE page = ?");
$q->bind_param("i", $page);
$q->execute();

$q->bind_result($id, $parent_id, $comment);

$all_results = array();

while ($q->fetch()) {
    $all_results[] = array(
        'id' => $id, 
        'parent_id' => $parent_id, 
        'text' => $comment);
}
$q->close();


$tc = new Threaded_Comments($all_results);
于 2011-01-12T20:35:08.693 に答える