Вложенные комментарии в PHP и MySQL

Я просматривал форумы, но не мог получить авторитетный ответ. Я хочу реализовать структуру вложенных комментариев таким образом, как это:

<ul> <li>This is the parent first comment! <ul> <li>This is the reply for the first parent comment! <ul> <li>This is a reply for the first reply of the parent comment!</li> <li>This is a third reply for the first parent comment!</li> </ul> </li> <li>This is another reply for first parent comment!</li> </ul> </li> <li>This is gonna be parent second comment! <ul> <li>This is a reply for the second comment!</li> </ul> </li> <li>This is fourth parent comment!</li> </ul> 

Дамп для моего стола ниже:

 +----+------------------------------------------------------------+--------+ | id | text | parent | +----+------------------------------------------------------------+--------+ | 1 | This is the parent first comment! | 0 | | 2 | This is gonna be parent second comment! | 0 | | 3 | This is the reply for the first parent comment! | 1 | | 4 | This is another reply for first parent comment! | 1 | | 5 | This is a reply for the first reply of the parent comment! | 3 | | 6 | This is a reply for the second comment! | 2 | | 7 | This is a third reply for the first parent comment! | 3 | | 8 | This is fourth parent comment! | 0 | +----+------------------------------------------------------------+--------+ 

Я знаю, как использовать mysql_query() и while() . Новичок в PHP и MySQL. Пожалуйста, помогите мне.

Я сделал что-то подобное для своего блога. Тем не менее, я просто опробовал те же данные. Когда вы говорите вложенные комментарии, лучше использовать такие вложенные функции :

 function getComments($parent) { # Get the data from SQL. # Check if it has nested comments. if (hasComments()) getComments($child); # $child is the ID of the current comment. } 

Чтобы сделать это, я импортировал ваши данные в MySQL и пробовал это:

 <?php mysql_connect('localhost', 'root'); mysql_select_db('nestedcomments'); function getComments($parent) { $res = mysql_query("SELECT * FROM `nestcomm` WHERE `parent` = $parent"); if (mysql_num_rows($res)) { echo "<ul>\n"; while (($dat = mysql_fetch_array($res)) !== false) echo "<li>", $dat["text"], getComments($dat["id"]), "</li>\n"; echo "</ul>\n"; } else echo ($parent === 0) ? 'No Comments!' : ""; } getComments(0); ?> 

Как я уже говорил, я использовал вложенные функции, и, поскольку вы спросили, что выход почти такой же (без фигурных скобок):

 <ul> <li>This is the parent first comment!<ul> <li>This is the reply for the first parent comment!<ul> <li>This is a reply for the first reply of the parent comment!</li> <li>This is a third reply for the first parent comment!</li> </ul> </li> <li>This is another reply for first parent comment!</li> </ul> </li> <li>This is gonna be parent second comment!<ul> <li>This is a reply for the second comment!</li> </ul> </li> <li>This is fourth parent comment!</li> </ul> 

Надеюсь, это поможет.

Существует несколько способов хранения иерархических данных в MySQL. Ознакомьтесь с презентацией Билла Карвина, которая демонстрирует четыре варианта.

  • Список прилавков
  • Просмотр пути
  • Вложенные наборы
  • Таблица закрытия

Вы используете модель списка смежности для хранения иерархических данных, но, к сожалению, это самая сложная модель, которую вы могли бы выбрать для запроса поддеревьев.

вложенный набор запросов

Ваши варианты:

  • Перейдите на другую модель.
  • Ограничьте запросы до n уровней.
  • Используйте хранимую процедуру для рекурсивного запроса. Дополнительные сведения об этом см. В серии статей Quassnoi – Иерархические запросы в MySQL .