|
|
|
| Структура таблицы:
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>
|
| |
|
|
|
|
|
|
|
для: Dizels
(04.11.2007 в 23:23)
| | Сделайте всё по-простому.
Создайте две таблицы. Одна "Катологи", другая "Подкаталоги".
В "Каталогах" структура такая:
id - идентификационный номер каталога.
name - название каталога.
В "Подкаталогах":
id - номер каталога из таблицы "Каталоги"
name - название подкаталога.
Дальше связать не составит труда. | |
|
|
|
|
|
|
|
для: morkovkin
(05.11.2007 в 10:31)
| | А зачем разбивать таблицу каталогов?
id -1, parent - 0, name - Белье
id -2, parent - 1, name - Дутское
id -3, parent - 2, name - Подгузники
.... | |
|
|
|
|
|
|
|
для: sim5
(05.11.2007 в 11:03)
| | Ситуация такова: такой способ предпалагает заранее опеределенную глубину дерева. А где гарантия,что в будущем глубина будет такой же ? | |
|
|
|
|
|
|
|
для: oradev
(06.11.2007 в 00:50)
| | Не вижу проблемы на глубину дерева. | |
|
|
|
|
|
|
|
для: sim5
(06.11.2007 в 04:25)
| | Поверьте sim5, когда применяя рекурсивную функцию обхода дерева из 50000 элементов ( помню эту жуткую бд металлопроката) сам по себе вывод дерева занимал минуты две. Так что я не рекомендую сразу формировать дерево. | |
|
|
|
|
|
|
|
для: oradev
(08.11.2007 в 10:31)
| | Ну да, тока чет не верится, что у автора 50000 эелементов будет :) | |
|
|
|
|
|
|
|
для: sim5
(08.11.2007 в 11:30)
| | Я подбросил идею, а дальше автору решать ... | |
|
|
|
|
|
|
|
для: Dizels
(04.11.2007 в 23:23)
| | Для себя данный вопрос я решил динамическим формированием дерева(при этом время построения такого дерева резко сокращается по сравнению с загрузкой всего дерева сразу). Суть такова, что изначально из базы вытягивается корневые узлы, а далее при выборе одного из этих узлов (в случаи если у узла есть потомки) динамически из базы подгружаются все эти потомки(дочерние узлы). Данная процедура вызывается для каждого узла, являющегося узлом-предком. | |
|
|
|
|
|
|
|
для: oradev
(06.11.2007 в 00:59)
| | Ребят, я вроде другое спрашивал)))))
Таблица как бы уже есть, она меня полностью устраивает, помогите вывод сделать таким, как я хочу. | |
|
|
|
|
|
|
|
для: Dizels
(06.11.2007 в 12:28)
| | А где у Вас подкаталоги? У Вас два числовых поля и одно текстовое.. куда и что вводится? | |
|
|
|
|
|
|
|
для: morkovkin
(06.11.2007 в 17:03)
| | Читаем про самосоединение таблиц. | |
|
|
|
|
|
|
|
для: oradev
(06.11.2007 в 17:23)
| | Ушёл читать... :) | |
|
|
|
|
|
|
|
для: morkovkin
(06.11.2007 в 17:26)
| | Такое ощущения, что в этой ветке каждый свое спрашивает и уходит:))))
Подскажите плз и мне:) Читать 1 пост! | |
|
|
|
|
|
|
|
для: Dizels
(06.11.2007 в 18:14)
| | У вас все каталоги с подкаталогами в одной таблице и как у вас описаны связи каталогов? Например, если все каталоги в одной таблице, то paret = 0 обычно означает корневой каталог, в противном случае parent указывает на калог родителя. Так у вас? И еще: товары может иметь только самый нижний каталог, а его родители могут содержать только подкаталоги - это условие соотвествует вашему? | |
|
|
|
|
|
|
|
для: sim5
(06.11.2007 в 18:24)
| |
Например, если все каталоги в одной таблице, то paret = 0 обычно означает корневой каталог, в противном случае parent указывает на калог родителя.
|
Да так!
товары может иметь только самый нижний каталог, а его родители могут содержать только подкаталоги - это условие соотвествует вашему?
|
Нет, товар может содержаться не только в самых нижних каталогах, а и на "родителях". | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(09.11.2007 в 06:08)
| | Может я не совсем понятно объяснил, а может чего не понял в функции которую написал sim5.
Мне нужно, чтобы при заходе на сайт(index.php) отображались главные каталоги (у которых id_parent=0) и их подкаталоги (1 вложенности). Чтобы более понятно было - посмотрите на каталог Яндекса http://yaca.yandex.ru/.
Как мне вот такое реализовать? | |
|
|
|
|
|
|
|
для: Dizels
(15.11.2007 в 11:59)
| | Функция, которую я привел, и вернет вам массив дерева каталогов с учетом их вложения. Если вы будете из базы брать три параметра каталога, как в примере: id, название, родителя, то четвертым параметром для каталога в массиве добавляется уровень его вложения ($row[3] = $level) - для корневого это будет 0, для последующего 1, 2, 3... и т.д.
Чтобы построить то, что вы привели по ссылке, этого вполне достаточно. | |
|
|
|
|
|
|
|
для: Dizels
(15.11.2007 в 11:59)
| | Ну, если не понимаете делайте без рекурсии, как вы и пытались. В этом случаи у вас будут два вложенных цикла. | |
|
|
|