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

Форум PHP

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

 

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

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

тема: Как лучше сделать вложенность категорий
 
 автор: tima2010   (01.09.2011 в 07:59)   письмо автору
 
 

привет есть задача сделать на php и mysql список категорий и под категорий с неограниченной вложенностью
хотел спросить совета как это лучше реализовать?
по моим соображениям это должно выглядеть так:

Создаем таблицу category с полями:

mysql_query("
CREATE TABLE IF NOT EXISTS category (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
parent INT,
title VARCHAR(255)
) ENGINE=MyISAM CHARACTER SET=utf8;
") 


далее при создании категории в поле parent записываем ID категории родителя
и тут не могу понять как дальше выводить уровни категорий?
чтобы сначала выводились родители внутри под категории далее под под категории и так далее?

подскажите пожалуйста как лучше реализовать данную задачу?

спасибо.

  Ответить  
 
 автор: Valick   (01.09.2011 в 08:55)   письмо автору
 
   для: tima2010   (01.09.2011 в 07:59)
 

для обхода вашего (точнее классического) варианта придется использовать рекурсию и вложенные запросы
а еще есть вот это http://www.getinfo.ru/article610.html

  Ответить  
 
 автор: tima2010   (01.09.2011 в 09:05)   письмо автору
 
   для: Valick   (01.09.2011 в 08:55)
 

как все не просто, а есть не (классический) вариант реализации вложенность?

  Ответить  
 
 автор: Valick   (01.09.2011 в 09:16)   письмо автору
 
   для: tima2010   (01.09.2011 в 09:05)
 

а по ссылке как раз и есть "неклассический" вариант который называется NESTED SETS
есть и другие варианты, можете погуглить на досуге на тему

  Ответить  
 
 автор: tima2010   (01.09.2011 в 19:01)   письмо автору
 
   для: Valick   (01.09.2011 в 09:16)
 

а вот этот вариант чем плох?

<?php 
include( "dbopen.php" ); 

function 
ShowTree($ParentID$lvl) { 

global 
$link
global 
$lvl
$lvl++; 

$sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
$result=mysql_query($sSQL$link);

if (
mysql_num_rows($result) > 0) {
echo(
"<UL>\n");
while ( 
$row mysql_fetch_array($result) ) {
$ID1 $row["id"];
echo(
"<LI>\n");
echo(
"<A HREF=\""."?ID=".$ID1."\">".$row["title"]."</A>"."  \n");
ShowTree($ID1$lvl); 
$lvl--;
}
echo(
"</UL>\n");
}

}

ShowTree(00); 

mysql_close($link); 

?> 


хотя понятно, видимо количеством запросов

  Ответить  
 
 автор: cheops   (01.09.2011 в 19:18)   письмо автору
 
   для: tima2010   (01.09.2011 в 19:01)
 

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

  Ответить  
 
 автор: tima2010   (01.09.2011 в 19:36)   письмо автору
 
   для: cheops   (01.09.2011 в 19:18)
 

Спасибо cheops за развернутый ответ!
есть ли на softtime развернутый ответ с примером реализации?

  Ответить  
 
 автор: Valick   (01.09.2011 в 19:52)   письмо автору
 
   для: tima2010   (01.09.2011 в 19:36)
 

поверьте, это далеко не развернутый ответ, читайте книги которые написал Игорь Вячеславович (cheops) вот там действительно развернутые ответы на большинство вопросов :)
готового кода вы скорее всего не найдете тут на софттайме, скажем так на таком уровне программисты уже не охотно делятся готовым кодом над которым потрачено не один десяток часов
это вам не echo "Привет, мир!"; )) тут уже придется варить своей тыковкой, ну а на форуме шлифовать нюансы

  Ответить  
 
 автор: tima2010   (01.09.2011 в 19:56)   письмо автору
 
   для: Valick   (01.09.2011 в 19:52)
 

Спасибо :) пока что изучаю
http://www.getinfo.ru/article610.html

  Ответить  
 
 автор: cheops   (01.09.2011 в 20:02)   письмо автору
 
   для: tima2010   (01.09.2011 в 19:36)
 

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

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

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