|
|
|
| Есть база каталогов с полями id, parent_id - там хранятся каталоги, кол-во подкаталогов может быть любым. Никак не разберусь как выводить все подкаталоги.
Понимаю что нужно написать функцию, которая будет рекурсивно проверять, есть ли у записи parent_id и если есть, выводить все каталоги с id == parent_id и так пока это условию выполнено не будет.
сейчас код такой
// выборка всех родительских каталогов
$query_sel = mysql_query("SELECT * FROM catalogs WHERE parent_id = 0");
if (!$query_sel) exit();
while ($cid = mysql_fetch_array($query_sel)) {
/* тут должна быть выборка всех подкаталогов родительского каталога.
отсюда как я думаю запрос нужно вынести в отдельную функцию, которая будет выводить по одному подкаталогу родителя,
и одновременно проверять, если у него есть parent_id (подкаталог 2-го уровня), вызвать её ещё раз с id этого parent_id.
проблема в том, что такая функция будет возвращать всегда первую строчку из базы, а не каждый раз следующую.
т.е. мне нужна "своя" ф-ия mysql_fetch_xyz которая сама бы перемещала указатели
$query_sub = mysql_query("SELECT * FROM catalogs WHERE parent_id = '".$cid['id']."' ");
if (!$query_sub) exit();
while ($sid = mysql_fetch_array($query_sub)) {
...
}
}
|
но он естественно выводит только первый подкаталог
если сумбурно, то коротко так: как сделать вывод всех каталогов с любым количеством подкаталогов. | |
|
|
|
|
|
|
|
для: NIK
(06.04.2010 в 21:23)
| | Нужно делать наоборот.
<?php
function print_catalogs($id_parent){
$query = "SELECT * FROM `catalogs` WHERE `id_parent` = $id_parent";
$res = mysql_query($query);
if (!$res) exit("Ошибка при извлечении вложенных каталогов");
while ($cat = mysql_fetch_array($res)) {
echo "<li>".$cat['name'];
$id_catalog = $cat['id_catalog'];
//Проверяем, имеются ли вложенные каталоги
$query = "SELECT COUNT(*) FROM `catalogs` WHERE `id_parent` = $id_catalog";
$result = mysql_query($query);
if (!$result) exit("Ошибка при считывании количества вложенных каталогов");
if (mysql_result($result,0) > 0){
//Если имеются вложенные разделы
echo "<ul>";
print_catalogs($id_catalog);//Вызываем самих себя
echo "</ul>";
}
}
}
//Здесь произвольный код
//Выводим дерево каталогов
print_catalogs(0);//Выводим список каталогов, которые находятся в корневом каталоге
?>
| Сначала выводим список каталогов, находящихся в корневом каталоге, а после выведения каждого из каталогов проверяем, имеются ли у этого каталога вложенные каталоги. Если имеются - рекурсия. | |
|
|
|