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

Форум MySQL

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

 

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

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

тема: вывод каталог и подкаталогов
 
 автор: Dizels   (04.11.2007 в 23:23)   письмо автору
 
 

Структура таблицы:

CREATE TABLE `catalog` (
  `id_catalog` int(11) NOT NULL auto_increment,
  `name` text NOT NULL,
  `id_parent` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_catalog`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Нужно выводить информацию из этой таблицы след. образом:

КАТАЛОГ КАТАЛОГ
подкаталог, подкаталог..... подкаталог, подкаталог....

Для лучше понимания - можно посмотреть на каталог Яндекса http://yaca.yandex.ru/

т.е. КАТАЛОГ - я легко определяю (id_parent=0)
а вот как определить соответствие подкаталогов к КАТАЛОГУ ?

Вот пока написал скрипт вывода КАТАЛОГОВ:

<?php require_once("admin/config.php"); ?>
<table border="1" width="100%">
<?php
  
// Выбираем из базы данных каталоги
$query "SELECT * FROM catalog 
            WHERE id_parent = '0'"
;
  
$prt mysql_query($query);
  if(!
$prt)
  {
    echo 
"error : ".mysql_error()."<br>";
    echo 
$query;
    
puterror("Ошибка при обращении к блоку");
  }
  
// Если в группе имеется хотя бы одна
  // запись - формируем таблицу с каталогами
  
if(mysql_num_rows($prt) > 0)
  {
    
// Вспомогательная переменная для вывода
    // записей по 3 штуки в строке
    
$td == 0;
    while(
$par mysql_fetch_array($prt))
    {
      if (
$td == 0) echo "<tr>";
      
// Выводим каталог
      
echo "<td><b>".$par['name']."</b></td>";
      
// Увеличиваем значение временной переменной $td
      
$td++;
      
// Если временная переменная $td принимает значение
      // равное 3, следовательно строка завершена, и необходимо
      // вывести завершающий тэг </tr>, а значение самой
      // переменной обнулить
      
if ($td == 3)
      {
        echo 
"</tr>";
        
$td 0;
      }         
    }
  }
?>
</table>

   
 
 автор: morkovkin   (05.11.2007 в 10:31)   письмо автору
 
   для: Dizels   (04.11.2007 в 23:23)
 

Сделайте всё по-простому.
Создайте две таблицы. Одна "Катологи", другая "Подкаталоги".
В "Каталогах" структура такая:
id - идентификационный номер каталога.
name - название каталога.
В "Подкаталогах":
id - номер каталога из таблицы "Каталоги"
name - название подкаталога.

Дальше связать не составит труда.

   
 
 автор: sim5   (05.11.2007 в 11:03)   письмо автору
 
   для: morkovkin   (05.11.2007 в 10:31)
 

А зачем разбивать таблицу каталогов?
id -1, parent - 0, name - Белье
id -2, parent - 1, name - Дутское
id -3, parent - 2, name - Подгузники
....

   
 
 автор: oradev   (06.11.2007 в 00:50)   письмо автору
 
   для: sim5   (05.11.2007 в 11:03)
 

Ситуация такова: такой способ предпалагает заранее опеределенную глубину дерева. А где гарантия,что в будущем глубина будет такой же ?

   
 
 автор: sim5   (06.11.2007 в 04:25)   письмо автору
 
   для: oradev   (06.11.2007 в 00:50)
 

Не вижу проблемы на глубину дерева.

   
 
 автор: oradev   (08.11.2007 в 10:31)   письмо автору
 
   для: sim5   (06.11.2007 в 04:25)
 

Поверьте sim5, когда применяя рекурсивную функцию обхода дерева из 50000 элементов ( помню эту жуткую бд металлопроката) сам по себе вывод дерева занимал минуты две. Так что я не рекомендую сразу формировать дерево.

   
 
 автор: sim5   (08.11.2007 в 11:30)   письмо автору
 
   для: oradev   (08.11.2007 в 10:31)
 

Ну да, тока чет не верится, что у автора 50000 эелементов будет :)

   
 
 автор: oradev   (08.11.2007 в 14:23)   письмо автору
 
   для: sim5   (08.11.2007 в 11:30)
 

Я подбросил идею, а дальше автору решать ...

   
 
 автор: oradev   (06.11.2007 в 00:59)   письмо автору
 
   для: Dizels   (04.11.2007 в 23:23)
 

Для себя данный вопрос я решил динамическим формированием дерева(при этом время построения такого дерева резко сокращается по сравнению с загрузкой всего дерева сразу). Суть такова, что изначально из базы вытягивается корневые узлы, а далее при выборе одного из этих узлов (в случаи если у узла есть потомки) динамически из базы подгружаются все эти потомки(дочерние узлы). Данная процедура вызывается для каждого узла, являющегося узлом-предком.

   
 
 автор: Dizels   (06.11.2007 в 12:28)   письмо автору
 
   для: oradev   (06.11.2007 в 00:59)
 

Ребят, я вроде другое спрашивал)))))
Таблица как бы уже есть, она меня полностью устраивает, помогите вывод сделать таким, как я хочу.

   
 
 автор: morkovkin   (06.11.2007 в 17:03)   письмо автору
 
   для: Dizels   (06.11.2007 в 12:28)
 

А где у Вас подкаталоги? У Вас два числовых поля и одно текстовое.. куда и что вводится?

   
 
 автор: oradev   (06.11.2007 в 17:23)   письмо автору
 
   для: morkovkin   (06.11.2007 в 17:03)
 

Читаем про самосоединение таблиц.

   
 
 автор: morkovkin   (06.11.2007 в 17:26)   письмо автору
 
   для: oradev   (06.11.2007 в 17:23)
 

Ушёл читать... :)

   
 
 автор: Dizels   (06.11.2007 в 18:14)   письмо автору
 
   для: morkovkin   (06.11.2007 в 17:26)
 

Такое ощущения, что в этой ветке каждый свое спрашивает и уходит:))))
Подскажите плз и мне:) Читать 1 пост!

   
 
 автор: sim5   (06.11.2007 в 18:24)   письмо автору
 
   для: Dizels   (06.11.2007 в 18:14)
 

У вас все каталоги с подкаталогами в одной таблице и как у вас описаны связи каталогов? Например, если все каталоги в одной таблице, то paret = 0 обычно означает корневой каталог, в противном случае parent указывает на калог родителя. Так у вас? И еще: товары может иметь только самый нижний каталог, а его родители могут содержать только подкаталоги - это условие соотвествует вашему?

   
 
 автор: Dizels   (08.11.2007 в 22:42)   письмо автору
 
   для: sim5   (06.11.2007 в 18:24)
 


Например, если все каталоги в одной таблице, то paret = 0 обычно означает корневой каталог, в противном случае parent указывает на калог родителя.

Да так!

товары может иметь только самый нижний каталог, а его родители могут содержать только подкаталоги - это условие соотвествует вашему?

Нет, товар может содержаться не только в самых нижних каталогах, а и на "родителях".

   
 
 автор: sim5   (09.11.2007 в 06:08)   письмо автору
 
   для: Dizels   (08.11.2007 в 22:42)
 

Рекурсивный вызов, но только почитайте сообщения от oradev, чем это грозит при большой вложенности.

<?
function listCatalog($parent,$level) {
$q mysql_query("SELECT id, name, parent, ... FROM tableName WHERE id<>0 and parent=$parent ORDER BY fieldName") or die (mysql_error());
$a = array();
  while (
$row mysql_fetch_row($q)) {
    
$row[3] = $level;
    
$a[] = $row;
    
$b listCatalog($row[0],$level+1);
    
$a array_merge($a$b);
  }
 return 
$a;
}
$categories listCatalog(0,0);
?>

   
 
 автор: Dizels   (15.11.2007 в 11:59)   письмо автору
 
   для: sim5   (09.11.2007 в 06:08)
 

Может я не совсем понятно объяснил, а может чего не понял в функции которую написал sim5.
Мне нужно, чтобы при заходе на сайт(index.php) отображались главные каталоги (у которых id_parent=0) и их подкаталоги (1 вложенности). Чтобы более понятно было - посмотрите на каталог Яндекса http://yaca.yandex.ru/.

Как мне вот такое реализовать?

   
 
 автор: sim5   (15.11.2007 в 12:15)   письмо автору
 
   для: Dizels   (15.11.2007 в 11:59)
 

Функция, которую я привел, и вернет вам массив дерева каталогов с учетом их вложения. Если вы будете из базы брать три параметра каталога, как в примере: id, название, родителя, то четвертым параметром для каталога в массиве добавляется уровень его вложения ($row[3] = $level) - для корневого это будет 0, для последующего 1, 2, 3... и т.д.
Чтобы построить то, что вы привели по ссылке, этого вполне достаточно.

   
 
 автор: oradev   (16.11.2007 в 14:53)   письмо автору
 
   для: Dizels   (15.11.2007 в 11:59)
 

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

   
Rambler's Top100
вверх

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