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

Форум MySQL

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

 

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

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

тема: Способ решения структуры таблицы и вывода данных
 
 автор: virtus   (18.05.2006 в 12:46)   письмо автору
 
 

День добрый. Столкнулся с трудностями. Сейчас структура таблицы такова:

  idcat int(11) NOT NULL auto_increment,
  pidcat int(11) NOT NULL default '0',
  name varchar(255) NOT NULL default '',
  PRIMARY KEY  (idcat)

скриптом на JS создается расскрывающееся меню с таблицы. НЕОБХОДИМО уйти от JS. Т.е. сделать меню, подпункты которого бы отображались при $_GET параметре PIDCAT. Этого я сделать не смог :(
Посоветуйте, может есть смысл сделать структуру таблицы с еще 3 столбцами в которых будет ID подкатегорий. НО как реализовать тогда вывод не пойму, что бы подпункты выводились именно под родителем?
Выслушаю любые предложения, спасибо

   
 
 автор: Axxil   (18.05.2006 в 13:23)   письмо автору
 
   для: virtus   (18.05.2006 в 12:46)
 

Меню обычно строят в виде дерева.
Т.е. к вашим полям добавляется ещё одно поле parent_id в котором будет храниться idcat родительcкого элемента.

   
 
 автор: virtus   (18.05.2006 в 13:32)   письмо автору
 
   для: Axxil   (18.05.2006 в 13:23)
 

Так и есть! У меня в таблице и есть PIDCAT - это и есть родительный каталог!
Я не знаю как вывести это дерево на экран - вот в чем ПРИЧИНА!

   
 
 автор: Axxil   (18.05.2006 в 14:07)   письмо автору
 
   для: virtus   (18.05.2006 в 13:32)
 

Тогда я бы лично чтоб не мучаться, добавил поле уровня каталога.
Скажем каталог 0 уровня (самый верхний) включает каталоги 1 уровня они в свою очередь второго и т.д. А дальше уже элементарно вывести вложенную структуру.

Другое дело построить эту структуру автоматически без вспомогательного поля. Тут, мне кажется нужен какой-то особо хитрый алгоритм... По крайней мере с наскока в лоб я не смог придумать ничего подходящего.

   
 
 автор: Loki   (18.05.2006 в 14:20)   письмо автору
 
   для: Axxil   (18.05.2006 в 14:07)
 

а почему не использовать рекурсию? Обычно именно так строят подобные штуки... если я правильно понял вопрос.

   
 
 автор: Axxil   (18.05.2006 в 14:45)   письмо автору
 
   для: Loki   (18.05.2006 в 14:20)
 

Я тоже думал в этом направлении, но потом мне показалось что овчинка выделки не стоит...

PS Надо будет на досуге попробовать написать функцию обхода дерева из n узлов. В качестве теста собственной самооценки :)

   
 
 автор: virtus   (18.05.2006 в 14:52)   письмо автору
 
   для: Axxil   (18.05.2006 в 14:45)
 

Мне все равно, рекурсия или нет... Мне необходимо это сделать любым способом :(

   
 
 автор: Loki   (18.05.2006 в 15:12)   письмо автору
 
   для: virtus   (18.05.2006 в 14:52)
 

Примерно так
<?
$otstup
="";
function 
tree($parent$otstup)
{
 
$sql="SELECT * FROM table WHERE parent_id=$parent"//выбираем все ветви данного узла
 
$result=mysql_query($sql);
 while(
$data=mysql_fetch_array)
 {
  echo 
$otstup.$data['text']."<br>"//выводим текущий узел
 
$otstup.="&nbsp"//увеличиваем отступ
  
tree($data['parent_id'], $otstup); //рекурсивно вызываем саму себя
 
}
}
echo 
"Корень<br>";
tree(0$otstup);


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

   
 
 автор: virtus   (18.05.2006 в 15:33)   письмо автору
 
   для: Loki   (18.05.2006 в 15:12)
 

Чуток не так! этот - выводит все дерево сразу!
А мне нужно так: вывести все где pidcat=0 (pidcat=0 ЭТО значит он родитель)
а когда будет известен idcat (т.е. получу его через ГЕТ : /index.php?idcat=5) - вывести все где pidcat=0 А ПОД 5 - вывести все где pidcat=5 т.е. все подкатегории этого раздела.
ВОт, вроде понятно пояснил?

   
 
 автор: Loki   (18.05.2006 в 15:59)   письмо автору
 
   для: virtus   (18.05.2006 в 15:33)
 

Тогда вообще просто:
<?
if (!isset($_GET['id'])) $id=0;
else 
$id=intval($_GET['id']);
$sql="SELECT * FROM table WHERE parent_id=$id";
$result=mysql_query($sql);
while (
$data=mysq_fetch_array($result))
{
 echo 
"<a href=".$_SERVER['PHPSELF']."?id=".$data['id'].">".$data['text']."</a><br>";
}


а... кажись дошло чего надо... надо ограничить уровень вложенности?
тогда так:
<? 
$otstup
=""
$level=0;
function 
tree($parent$otstup$level

if  (
$level>$_GET['level']) return;
$sql="SELECT * FROM table WHERE parent_id=$parent"//выбираем все ветви данного узла 
$result=mysql_query($sql); 
while(
$data=mysql_fetch_array

  echo 
$otstup.$data['text']."<br>"//выводим текущий узел 
  
$otstup.="&nbsp"//увеличиваем отступ 
  
tree($data['parent_id'], $otstup$level++); //рекурсивно вызываем саму себя 


echo 
"Корень<br>"
tree(0$otstup); 

Через get передаем уровень вложенности. И нигде его хранить не надо.

   
 
 автор: virtus   (18.05.2006 в 16:26)   письмо автору
 
   для: Loki   (18.05.2006 в 15:59)
 

ДА !! уровень вложености!!!
Warning: Missing argument 3 for tree()

   
 
 автор: Axxil   (18.05.2006 в 17:24)   письмо автору
 
   для: virtus   (18.05.2006 в 16:26)
 

Ну и добавьте третий аргумент в вызове функции tree

tree(0, $otstup,$level); 

   
 
 автор: virtus   (19.05.2006 в 10:17)   письмо автору
 
   для: Axxil   (18.05.2006 в 17:24)
 

Спасибо, только через ГЕТ не работает

   
 
 автор: Axxil   (18.05.2006 в 17:30)   письмо автору
 
   для: Loki   (18.05.2006 в 15:59)
 

Мда... Не так страшен чёрт как говорится.
Только маленькая поправка. Иначе получается бесконечная лесенка.

<?
function tree($parent$otstup$level

if  (
$level>$_GET['level']) return; 
$sql="SELECT * FROM table WHERE parent_id=$parent"//выбираем все ветви данного узла 
$result=mysql_query($sql); 
while(
$data=mysql_fetch_array

  echo 
$otstup.$data['text']."<br>"//выводим текущий узел 
  
tree($data['parent_id'], $otstup."&nbsp"$level++); //рекурсивно вызываем саму себя 


?>

   
 
 автор: virtus   (18.05.2006 в 17:45)   письмо автору
 
   для: Axxil   (18.05.2006 в 17:30)
 

ОШИБКА: ничего не отображает вообще!
если вот эту строку

 tree($data['parent_id'], $otstup."&nbsp", $level++); //рекурсивно вызываем саму себя

перенести за

}
}

то скрипт не понимает же что $data['parent_id'] - чему-то равно...
как поступить?

   
 
 автор: Axxil   (18.05.2006 в 17:54)   письмо автору
 
   для: virtus   (18.05.2006 в 17:45)
 

Само собой не выводит :)
Надо добавить вызов ф-ии tree

<? 
$otstup
=""
$level=0
function 
tree($parent$otstup$level

if  (
$level>$_GET['level']) return; 
$sql="SELECT * FROM table WHERE parent_id=$parent"//выбираем все ветви данного узла 
$result=mysql_query($sql); 
while(
$data=mysql_fetch_array

  echo 
$otstup.$data['text']."<br>"//выводим текущий узел 
  
tree($data['parent_id'], $otstup."&nbsp"$level++); //рекурсивно вызываем саму себя 


echo 
"Корень<br>"
tree(0$otstup); 
?> 


Да, забыл ещё одно поправление
Вместо $data['parent_id'] надо $data['catid'] из вашего первого поста. Так как в качестве родителя следующего по вложенности узла не может выступать родительтекущего.

   
 
 автор: virtus   (18.05.2006 в 18:06)   письмо автору
 
   для: Axxil   (18.05.2006 в 17:54)
 

спасибо большое за помощь!
в данном релизе :) выводится нужные родительные рубрики, НО как только появляется любой $_GET['level'] - выводятся все сразу подрубрики!!! А НЕОБХОДИМО ТОЛЬКО ПОДРУБРИКУ ТЕКУЩЕГО РОДИТЕЛЯ :(

   
 
 автор: virtus   (19.05.2006 в 11:48)   письмо автору
 
   для: virtus   (18.05.2006 в 18:06)
 

ПОДСКАЖИТЕ, пожалуйста :(

   
Rambler's Top100
вверх

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