Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивная выборка из базы
 
 автор: NIK   (06.04.2010 в 21:23)   письмо автору
 
 

Есть база каталогов с полями 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)) {
     ...
  }
}

но он естественно выводит только первый подкаталог

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

  Ответить  
 
 автор: Commander   (06.04.2010 в 21:38)   письмо автору
 
   для: 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);//Выводим список каталогов, которые находятся в корневом каталоге
?>
Сначала выводим список каталогов, находящихся в корневом каталоге, а после выведения каждого из каталогов проверяем, имеются ли у этого каталога вложенные каталоги. Если имеются - рекурсия.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования