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

Форум MySQL

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

 

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

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

тема: Рекурсивный вывод данных из Мускула
 
 автор: Ученик   (03.03.2006 в 17:48)   письмо автору
 
 

Есть такая таблица. В колонке id_cat хранятся идентификаторы каталогов к которым относится строка. Есть 2 главные категории "Программирование, Дизайн". В Программировании есть еще подкатегории, ПХП, Си++, Бейсик. И так далее. Помогите мне с функцией спуска по этим категориям. Я что-то запутался...

CREATE TABLE 'test' (
  'id' int(11) NOT NULL auto_increment,
  'name' text NOT NULL,
  'id_cat' int(11) NOT NULL default '0',
  PRIMARY KEY  ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;

-- 
-- Дамп данных таблицы 'test'
-- 

INSERT INTO 'test' VALUES (1, 'Программирование', 0);
INSERT INTO 'test' VALUES (2, 'Дизайн', 0);
INSERT INTO 'test' VALUES (3, 'PHP', 1);
INSERT INTO 'test' VALUES (4, 'C++', 1);
INSERT INTO 'test' VALUES (5, 'Basic', 1);
INSERT INTO 'test' VALUES (6, 'PHP 5. Практика создания web-сайтов', 3);
INSERT INTO 'test' VALUES (7, 'Авторы:\r\nКузнецов М.В. \r\nСимдянов И.В. \r\nГолышев С.В.', 6);
INSERT INTO 'test' VALUES (8, 'какая-то книга про Си', 4);


Вот что у меня получается, но он мне выводит только 1подкаталог, и все. Думаю заковырка где-то тут catalogs($i); Помогите разобраться.

<?
require_once "config.php";

function 
catalogs($id_podcat){
$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND podcat_id=$id_podcat");
$i=0;
    while(++
$i<=mysql_num_rows($result)){
        
$r=mysql_fetch_array($result);
        echo 
"<blockquote>$r[name]";
            
catalogs($i);
        echo 
"</blockquote>";
    }
}

catalogs(0);
?>


В аттаче дамп и моя функция.

   
 
 автор: Loki   (03.03.2006 в 17:59)   письмо автору
 
   для: Ученик   (03.03.2006 в 17:48)
 

А зачем тут рекурсия? что-то я не вижу никакой иерархии.

   
 
 автор: Ученик   (03.03.2006 в 18:13)   письмо автору
 
   для: Loki   (03.03.2006 в 17:59)
 


Программирование+
--------------------------PHP+
-----------------------------------PHP 5.Практика создания WEB сайтов+
-------------------------------------------------------------------------------------------Авторы: Кузнецов М.В.
-------------------------------------------------------------------------------------------Симдянов И.В. 
-------------------------------------------------------------------------------------------Голышев С...
--------------------------C++
------------------------------------Какая-то книга по Си
--------------------------Basic

Дизайн

Незнаю может так более понятно будет. Между собой строки связываются полем id и id_cat. Тоесть если id_cat=1, то это вложенность каталога с id=1...

   
 
 автор: Trianon   (03.03.2006 в 19:29)   письмо автору
 
   для: Ученик   (03.03.2006 в 18:13)
 

Например, так...
<?php
   
include 'config.inc.php';
   function 
level($lev$cat)
   {
     
$list = array();
     
$query " SELECT  id, id_cat, name FROM test where id_cat = $cat order by id";
     if((
$res=mysql_query($query)) != 0)
       while((
$row=mysql_fetch_array($resMYSQL_ASSOC)) != 0)
         
$list[] = $row;
     
mysql_free_result($res);
     foreach(
$list as $row)
     {
          echo 
str_repeat("---",$lev) ." "$row['id']. "." .$row['name']."<br>\r\n";
          
level($lev+1$row['id']);
     }
   }

   
level(0,0);
?>

   
 
 автор: Loki   (03.03.2006 в 20:20)   письмо автору
 
   для: Trianon   (03.03.2006 в 19:29)
 

А по-моем скорее так:

<? 
require_once "config.php"
function 
catalogs($id_podcat)

$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND id=$id_cat"); 
    while(
$r=mysql_fetch_array($result)){ 
        echo 
"<blockquote>$r[name]"
            
catalogs($r[id_cat]); 
        echo 
"</blockquote>"
    } 


catalogs(0); 
?>

Не запускал, но рекурсия, на мой взгляд, должна выглядеть примерно так.

   
 
 автор: Trianon   (03.03.2006 в 20:27)   письмо автору
 
   для: Loki   (03.03.2006 в 20:20)
 

У меня просто привычка закрывать ресурсы итераторов перед рекурсивным спуском.
mysql_query -- mysql_free_result, opendir -- closedir и т.п.
Визуально получается несколько более громоздко.

   
 
 автор: Trianon   (03.03.2006 в 20:36)   письмо автору
 
   для: Loki   (03.03.2006 в 20:20)
 

Ваш код заработал, но его пришлось причесать. Места причесывания я пометил жирным.
require_once "config.php"; 
function catalogs($id_podcat) 

$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND id=$id_cat"); 
    while($r=mysql_fetch_array($result)){ 
        echo "<blockquote>$r[name]"; 
            catalogs($r[id_cat]); 
        echo "</blockquote>"; 
    } 


catalogs(0); 


Вот что получилось.

<? 
require_once "config.php"
function 
catalogs($id_cat)
{
$result=mysql_query("SELECT * FROM test WHERE  id_cat=$id_cat");
    while(
$r=mysql_fetch_array($result)){
        echo 
"<blockquote> {$r['name']}";
            
catalogs($r['id']);
        echo 
"</blockquote>";
    }
}
catalogs(0); 
?> 


И всё же мне не понравился ни этот вариант, ни мой. Хотелось обойтись одним запросом к серверу БД. В результате получилось вот что:

<?php
   
function level($list$tree$id)
   {
       echo 
"<blockquote> "$list[$id]['name'];
       if(isset(
$tree[$id]))
         foreach(
$tree[$id] as $key)
           
level($list$tree$key);
       echo 
"</blockquote>";
   }

   include 
'config.inc.php';
     
$tree = array();     $list = array();
     
// $list[] = array('id' => 0, 'name' => 'root');

     
$query " SELECT  id, id_cat, name FROM test order by id";
     if((
$res=mysql_query($query)) != 0)
       while((
$row=mysql_fetch_array($resMYSQL_ASSOC)) != 0)
       {
         
$id     $row['id'];
         
$id_cat $row['id_cat'];
         
$list[$id] = $row;
         if(!isset(
$tree[$id_cat]))
                
$tree[$id_cat] = array();
         
$tree[$id_cat][] = $id;
       }
      
level($list$tree1);

  
//  echo '<pre> $tree:'; print_r($tree); echo "</pre>";
  //  echo '<pre> $list:'; print_r($list); echo "</pre>";
?>


И это как-то уже более менее устраивает. Меня во всяком случае.

   
 
 автор: Ученик   (04.03.2006 в 10:22)   письмо автору
 
   для: Trianon   (03.03.2006 в 20:36)
 

Всем спасибо, разобрался. Сейчас попробую ваши варианты.

   
Rambler's Top100
вверх

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