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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Иерархическое меню

Сообщения:  [1-10]   [11-12] 

 
 автор: cheops   (22.07.2005 в 11:56)   письмо автору
 
   для: Duran   (22.07.2005 в 08:34)
 

>по месту нового временного пребывания попрошусь в палату к
>египтянам :-).
:))) Буду ждать.

   
 
 автор: Duran   (22.07.2005 в 08:34)   письмо автору
 
   для: cheops   (21.07.2005 в 23:28)
 

:)))))))))))))) !
Супер !

Сотрудники сказали, что если я буду так орать, меня опять сдадут в психушку :))))).
Сheops, не знаю, скоко Вам платят, но явно, можно еще немного прибавить :-).

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

   
 
 автор: cheops   (21.07.2005 в 23:28)   письмо автору
 
   для: Duran   (21.07.2005 в 14:20)
 

Я бы сделал рекурсивную функцию такой
<?php
function seeknode($id_personal)// поиск зависимых ветвей
{
   
$seekstr.=" or id_personal=".$id_personal;
   
$query "select id_personal from personal where pid=$id_personal order by id_personal";
   
$sek mysql_query($query);
   if(!
$sek) exit(mysql_error());
   
// Если имеются подчинённые записи - рекурсивно вызываем функцию
   
if(mysql_num_rows($sek) > 0)
   {
     while(
$seek mysql_fetch_array($sek))
     {
       
seeknode($seek['id_personal']);
     }
   }
}
?>

а её вызов
<?php
   $seekstr
="select fio from personal where id_personal = 11";
   
seeknode(11);
   echo 
$seekstr;
?>

Если я, конечно, правильно понял, что требуется - в аттаче приводится вариант кода, который выодит все записи, формируя запрос вида
select fio from personal where id_personal = 11 or id_personal=11 or id_personal=12 or id_personal=13 or id_personal=14 or id_personal=15 or id_personal=22 or id_personal=23

   
 
 автор: Duran   (21.07.2005 в 14:20)   письмо автору
 
   для: cheops   (21.07.2005 в 14:13)
 

Согласен. У меня есть подозрения, что на большом количестве записей она схавает достаточно процессорного времени... Но почему процедура валится на 1-й записи ? Может, у вас есть функция, способная по id вычеслить всю цепочку и на выходе дать нужную информацию ?

Честно говоря, я не представляю, как это без массива сделать...

   
 
 автор: cheops   (21.07.2005 в 14:13)   письмо автору
 
   для: Duran   (21.07.2005 в 14:05)
 

Да исправлений то в общем никаких пока нет... Просто нужно вместо массива передавать по рекурсивному спуску $id записи и просто накапливать их в $nodestr. Просто рекурсивные задачи сами по себе очень сложны, а использование в них массивов и плавающих границ цикла делают их неподъёмными в отладке - рекурсивные функции должны быть очень легковесными :))) Если будут трудности - пишите, я рекурсии люблю :)))

   
 
 автор: Duran   (21.07.2005 в 14:05)   письмо автору
 
   для: cheops   (21.07.2005 в 13:53)
 

:))))
Понимаю ваше смущение :-).
Конечно, корневые элементы имеют PID =0 , а ID - только уникальные.
11- это просто ID нажатого элемента, который будет искальтся в PID, затем в найденных строкак берется ID и ищется в PID и т.д., пока по очередному ID ничего не найдется (значит он последний в ветви). Напомню, что задача упрощена. Я изъял процес формирования меню и передачу ID скрипту.

Массив M используется по 1-й причине - на одном уровне может быть более 1-й ветви.

Думаю, меню на таком же принципе достаточно распостранены, возможно у вас даже есть процедура, вылавливающая всю цепочку более оптимально. Эта функция важна еще и тем, что такая же формирует списки ID на удаление ветви...

   
 
 автор: cheops   (21.07.2005 в 13:53)   письмо автору
 
   для: Duran   (21.07.2005 в 13:13)
 

Меня смущает в test.php запрос
$seek="select * from personal where pid=11"

Почему именно 11, а не 0 - разве корень начинается не с 0?

   
 
 автор: cheops   (21.07.2005 в 13:52)   письмо автору
 
   для: Duran   (21.07.2005 в 13:13)
 

Самый верный способ - решить эту задачу - переписать функцию seeknode() без использования массива $m - так как он изличшне усложняет код. Если задача функции лишь формировать запросы вида
select fio from personal where id_personal=11 or id_personal=12 or id_personal=13 or id_personal=14 or id_personal=15

это можно сделать проще и надёжнее. Или у функции имеются ещё какие-то задачи?

PS Кстати запрос
select fio from personal where id_personal=11 or id_personal=12 or id_personal=13 or id_personal=14 or id_personal=15

Удобнее представлять в виде
select fio from personal where id_personal IN(11, 12, 13, 14, 15, 22, 23);

   
 
 автор: cheops   (21.07.2005 в 13:26)   письмо автору
 
   для: Duran   (21.07.2005 в 13:13)
 

А... понял... будут разбираться дальше.

   
 
 автор: Duran   (21.07.2005 в 13:13)   письмо автору
 
   для: cheops   (21.07.2005 в 12:44)
 

:-)
Вот ента штука для меня очень важна...
Моя задача достаточно масштабна, это ее очень маленькая часть, ктому же ее пришлось упростить и создать макет существующей базы. Суть в том, что в пункте это должно получиться: считываются все id, по ним выдаются значения поля FIO - этот пункт сделан, чтобы показать наличие в базе как минимум 6 заполненных полей FIO (ЭТО НЕ ВЫВОДИТСЯ! - тоже содержится в поле FIO) .
База, как было уже сказано используется для создания иерархического меню. Каждая подчиненная ветвь содержит PID - это ID родительской ветви. Так вот, суть этого скрипта - выявить всю цепочку от указанного (выбранного ID) до последнего элемента ветви. Но как видно из пункта
а выводится вот ЭТО (последней записи нет):
Последняя запись "ЭТО НЕ ВЫВОДИТСЯ!" не выдается скриптом, хотя она находится в ветви и содержит ID родителского звена....

По какой то причине select id_personal from personal where pid=$m[$i] не срабатывает при id_personal = 15 в поле PID, хотя он там есть !

Кстати, если в строке for($i = $len;$i < $f_len;$i++)
заменить "<" на "<=" то запись находится, но... естественно вываливается ошибка индекса массива... Короче, черепица сипется...

   

Сообщения:  [1-10]   [11-12] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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