|
|
|
|
|
для: Duran
(22.07.2005 в 08:34)
| | >по месту нового временного пребывания попрошусь в палату к
>египтянам :-).
:))) Буду ждать. | |
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 23:28)
| | :)))))))))))))) !
Супер !
Сотрудники сказали, что если я буду так орать, меня опять сдадут в психушку :))))).
Сheops, не знаю, скоко Вам платят, но явно, можно еще немного прибавить :-).
В тестовом режиме все работает на вот то, что описано выше (соседи все еще нездорово косятся), сейчас же переписываю алгоритм во все рабочие рекурсии и ежели все заработает ... по месту нового временного пребывания попрошусь в палату к египтянам :-). | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 14:13)
| | Согласен. У меня есть подозрения, что на большом количестве записей она схавает достаточно процессорного времени... Но почему процедура валится на 1-й записи ? Может, у вас есть функция, способная по id вычеслить всю цепочку и на выходе дать нужную информацию ?
Честно говоря, я не представляю, как это без массива сделать... | |
|
|
|
|
|
|
|
для: Duran
(21.07.2005 в 14:05)
| | Да исправлений то в общем никаких пока нет... Просто нужно вместо массива передавать по рекурсивному спуску $id записи и просто накапливать их в $nodestr. Просто рекурсивные задачи сами по себе очень сложны, а использование в них массивов и плавающих границ цикла делают их неподъёмными в отладке - рекурсивные функции должны быть очень легковесными :))) Если будут трудности - пишите, я рекурсии люблю :))) | |
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 13:53)
| | :))))
Понимаю ваше смущение :-).
Конечно, корневые элементы имеют PID =0 , а ID - только уникальные.
11- это просто ID нажатого элемента, который будет искальтся в PID, затем в найденных строкак берется ID и ищется в PID и т.д., пока по очередному ID ничего не найдется (значит он последний в ветви). Напомню, что задача упрощена. Я изъял процес формирования меню и передачу ID скрипту.
Массив M используется по 1-й причине - на одном уровне может быть более 1-й ветви.
Думаю, меню на таком же принципе достаточно распостранены, возможно у вас даже есть процедура, вылавливающая всю цепочку более оптимально. Эта функция важна еще и тем, что такая же формирует списки ID на удаление ветви... | |
|
|
|
|
|
|
|
для: Duran
(21.07.2005 в 13:13)
| | Меня смущает в test.php запрос
$seek="select * from personal where pid=11"
|
Почему именно 11, а не 0 - разве корень начинается не с 0? | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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++)
заменить "<" на "<=" то запись находится, но... естественно вываливается ошибка индекса массива... Короче, черепица сипется... | |
|
|
|
|