[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Список типа Tree из PostgreSQL
Kukaramba

Необходимо вывести структурное меню (типа tree). Имеются таблицы первого и второго уровней, с обозначениями (id, id_parent). Как можно вывести такое меню с возможностью перехода к нужной таблице посредством PHP?

Древовидный список
Есть запрос, вида:

Свернутый текст


<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><?php

// database access parameters
// alter this as per your configuration

$host = "192***";
$user = "user";
$pass = "123";
$db = "ST";
$table= "project";


// open a connection to the database server
$connection = pg_pconnect ("host=$host dbname=$db user=$user password=$pass");
if (!$connection)
{
die("Could not open connection to database server");
}

// generate and execute a query

WITH RECURSIVE search_graph(id, id_parent, name, org, date, depth, path, cycle) AS (
SELECT g.id, g.id_parent, g.name, g.org, g.date, 1,
ARRAY[g.id],
false
FROM graph g
UNION ALL
SELECT g
.id, g.id_parent, g.name, g.org, g.date, sg.depth + 1,
path || g.id,
g.id = ANY(path)
FROM graph g, search_graph sg
WHERE g
.id = sg.link AND NOT cycle
)
//SELECT * FROM search_graph;
//$query = "SELECT id,id_parent FROM $table ORDER BY id_parent";


$query = "SELECT * FROM search_graph";

$result = pg_query($connection, $query) or die("Error in query: $query.
"
. pg_last_error($connection));


$result = pg_query($query) or die('Query failed: ' . pg_last_error());


function print_tree(&$res, &$row, $lvl=1)
{ if ($row = pg_fetch_assoc($res)) {
if ($row['level'] = $lvl) {
echo '<ul>';
while ($row['level'] = $lvl) {
echo "<li>{$row['id']}"; -- описание, или что хотите отразить в списке (название)
print_tree($res, $row, $lvl+1); -- рекурсивно выводим поддерево текущего узла
echo '</li>';
}
echo '</ul>';
}
}
}


// и вызов:
$row = 0;
echo print_tree($result, $row);











// get the number of rows in the resultset
$rows = pg_num_rows($result);
echo "There are currently $rows records in the database.";
// close database connection
pg_close($connection);
?></body></html>



Знаю, что запрос на вывод древовидного построения таблиц имеет вид:

Свернутый текст


WITH RECURSIVE search_graph(id, id_parent, name, org, date, depth, path, cycle) AS (
SELECT g.id, g.id_parent, g.name, g.org, g.date, 1,
ARRAY[g.id],
false
FROM graph g
UNION ALL
SELECT g.id, g.id_parent, g.name, g.org, g.date, sg.depth + 1,
path || g.id,
g.id = ANY(path)
FROM graph g, search_graph sg
WHERE g.id = sg.link AND NOT cycle
)
SELECT * FROM search_graph;




для вывода

<?php
function
print_tree(&$res, &$row, $lvl=1)
{ if ($row = pg_fetch_assoc($res)) {
if ($row['level'] = $lvl) {
echo '<ul>';
while ($row['level'] = $lvl) {
echo "<li>{$row['description']}"; -- описание, или что хотите отразить в списке (название)
print_tree($res, $row, $lvl+1); -- рекурсивно выводим поддерево текущего узла
echo '</li>';
}
echo '</ul>';
}
}
}


// и вызов:
$row = 0;
print_tree($result, $row);
?>


Тему взял отсюда: http://postgresql.ru.net/manual/queries-with.html
Помогите сделать эту менюшку. Я уже весь интернет облазил.... sad.gif sad.gif sad.gif



Спустя 3 дня, 1 час, 11 минут, 42 секунды (3.05.2010 - 17:38) Kukaramba написал(а):
Народ, неужели никто не может помочь??

Спустя 4 часа, 43 минуты, 43 секунды (3.05.2010 - 22:22) sergeiss написал(а):
А ты обозначь, что же именно тебе не понятно? "Непонятно всё" - это не вариант.

Спустя 1 час, 15 минут, 16 секунд (3.05.2010 - 23:37) Kukaramba написал(а):
По сути мне непонятно как можно совместить код php с кодом построения списка tree, который есть, но он в SQL запросе

WITH RECURSIVE search_graph(id, id_parent, name, org, date, depth, path, cycle) AS (
SELECT g.id, g.id_parent, g.name, g.org, g.date, 1,
ARRAY[g.id],
false
FROM graph g
UNION ALL
SELECT g.id, g.id_parent, g.name, g.org, g.date, sg.depth + 1,
path || g.id,
g.id = ANY(path)
FROM graph g, search_graph sg
WHERE g.id = sg.link AND NOT cycle
)
//SELECT * FROM search_graph;
//$query = "SELECT id,id_parent FROM $table ORDER BY id_parent";

$query = "SELECT * FROM search_graph";

Спустя 7 минут, 37 секунд (3.05.2010 - 23:45) sergeiss написал(а):
Цитата (Kukaramba @ 4.05.2010 - 00:37)
По сути мне непонятно как можно совместить код php с кодом построения списка tree, который есть, но он в SQL запросе

А в таком случае мне непонятно, что же тут непонятного smile.gif

1. Создается запрос, который уходит в Постгре. Он там обрабатывается, выдает таблицу с данными. ПХП на этом этапе просто тупо ждет.
2. ПХП получает таблицу и обрабатывает ее. Например, выводит. И для ПХП совершенно "фиолетово", какие там списки обрабатывались, какие данные выбирались... Не важно, что именно выбиралось. Вывод данных - это уже представление программера о том, как это должно выглядеть.

Если тебе непонятен этап 1, то давай его разбирать.

Спустя 5 минут, 44 секунды (3.05.2010 - 23:50) Kukaramba написал(а):
Вооот. Вообще не понятно - как это написать????

Спустя 2 минуты, 35 секунд (3.05.2010 - 23:53) sergeiss написал(а):
Цитата (Kukaramba @ 4.05.2010 - 00:50)
Вообще не понятно - как это написать????

Что именно "ЭТО"???

Спустя 8 минут, 33 секунды (4.05.2010 - 00:02) Kukaramba написал(а):
Каким образом можно включить запрос типа

Свернутый текст

function print_tree(&$res, &$row, $lvl=1)
{ if ($row = pg_fetch_assoc($res)) {
if ($row['level'] = $lvl) {
echo '<ul>';
while ($row['level'] = $lvl) {
echo "<li>{$row['description']}"; -- описание, что хотите отразить в списке (название)
print_tree($res, $row, $lvl+1); -- рекурсивно выводим поддерево текущего узла
echo '</li>';
}
echo '</ul>';
}
}
}


// и вызов:
$row = 0;
print_tree($result, $row);



В php код для моей БД, и чтобы работало? Просто я понимаю что здесь есть ошибки, но где именно - для меня загадка.

Спустя 4 минуты, 32 секунды (4.05.2010 - 00:06) sergeiss написал(а):
Глубоко не вникал, но вот тут
 while ($row['level'] = $lvl)

однозначная ошибка, т.к. это присвоение, а не сравнение. И если $lvl не равно нулю, то получаем вечный цикл.

Спустя 11 минут, 36 секунд (4.05.2010 - 00:18) Kukaramba написал(а):

Тогда может быть объявить $lvl=0 в начале и получится так:???

<?php 

// database access parameters
// alter this as per your configuration

$host = "192***";
$user = "user";
$pass = "123";
$db = "ST";
$table= "project";
[
b]$lvl=0[/b]

// open a connection to the database server
$connection = pg_pconnect ("host=$host dbname=$db user=$user password=$pass");
if (!$connection)
{
die("Could not open connection to database server");
}

// generate and execute a query

//SELECT * FROM search_graph;
//$query = "SELECT id,id_parent FROM $table ORDER BY id_parent";


$query = "SELECT * FROM search_graph";

$result = pg_query($connection, $query) or die("Error in query: $query.
"
. pg_last_error($connection));


$result = pg_query($query) or die('Query failed: ' . pg_last_error());

function print_tree(&$res, &$row, $lvl=1)
{ if ($row = pg_fetch_assoc($res)) {
if ($row['level'] = $lvl) {
echo '<ul>';
while ($row['level'] = $lvl) {
echo "<li>{$row['id']}"; -- описание, что отразить в списке (название)
print_tree($res, $row, $lvl+1); -- рекурсивно выводим поддерево текущего узла
echo '</li>';
}
echo '</ul>';
}
}
}


// и вызов:
$row = 0;
echo print_tree($result, $row);

// get the number of rows in the resultset
$rows = pg_num_rows($result);
echo "There are currently $rows records in the database.";
// close database connection
pg_close($connection);
?>

Спустя 1 минута, 35 секунд (4.05.2010 - 00:19) sergeiss написал(а):
Тебе эти слова
Цитата (sergeiss @ 4.05.2010 - 01:06)
но вот тут
while ($row['level'] = $lvl)
однозначная ошибка, т.к. это присвоение, а не сравнение.

Ни о чем не говорят? Что надо исправить в коде, чтобы избавиться от ошибки??? Чтобы было именно сравнение, а не присвоение?

Спустя 4 минуты, 54 секунды (4.05.2010 - 00:24) Kukaramba написал(а):
У меня задача - вывести менюшку. Есть поля id и id_parent. Они используются для обозначения таблиц верхнего уровня и ниже. Думаю здесь идет сравнение.

Спустя 1 минута, 43 секунды (4.05.2010 - 00:26) sergeiss написал(а):
Цитата (Kukaramba @ 4.05.2010 - 01:24)
Думаю здесь идет сравнение.

Правильно думаешь... А сравнение как пишется в ПХП, какие возможны варианты? wink.gif

Спустя 8 минут, 34 секунды (4.05.2010 - 00:34) Kukaramba написал(а):
через if?

Спустя 6 минут, 3 секунды (4.05.2010 - 00:41) sergeiss написал(а):
$row['level'] = $lvl - это присвоение или сравнение??? Правильно, присвоение. Что надо изменить, чтобы получить сравнение, сохранивши цикл while?

Спустя 1 минута, 19 секунд (4.05.2010 - 00:42) Kukaramba написал(а):
if
{
$row['level'] = $lvl
}

Так??

Спустя 1 минута, 29 секунд (4.05.2010 - 00:43) sergeiss написал(а):
<тут была длинная фраза, вырезанная цензурой по причине нецензурности этой фразы....>

Скачай хэлп из моей подписи. И найди там операторы сравнения!!!

Спустя 8 минут, 54 секунды (4.05.2010 - 00:52) Kukaramba написал(а):
понял причину цензуры....
$row['level'] !== $lvl

так??

Спустя 2 минуты, 26 секунд (4.05.2010 - 00:55) sergeiss написал(а):
Цитата (Kukaramba @ 4.05.2010 - 01:52)
$row['level'] !== $lvl

так??
Это зависит от того, что ты в логике закладываешь. Такого типа сравнение, в данном случае, скорее всего может только к ошибочной оценке привести.

Прочитай словами то, что должно быть заложено языком ПХП, а потом переведи это на язык ПХП.

Спустя 3 минуты, 26 секунд (4.05.2010 - 00:58) Kukaramba написал(а):
тогда может быть

$row['level'] <= $lvl

так вроде логичнее....

Спустя 23 минуты, 16 секунд (4.05.2010 - 01:21) Kukaramba написал(а):
Пишет ошибку sad.gif Вообще страницу открыть не может....

Спустя 5 часов, 19 минут, 38 секунд (4.05.2010 - 06:41) sergeiss написал(а):
Распиши СЛОВАМИ (!) логику функции print_tree. Там мало того, что цикл while было организован неправильно (вот это самое сравнение, о котором говорили), так еще и вообще этот цикл не правильно сделан, похоже... Так что опиши логику того, что ты ХОЧЕШЬ получить, и опиши логику того, что эта функция делает СЕЙЧАС.

Спустя 3 часа, 32 минуты, 40 секунд (4.05.2010 - 10:14) Kukaramba написал(а):
Хочу получить меню вида с возможностью перехода, или хотя бы вывести их для начала....

-> Таблица 1
----> Таблица 1.1
----> Таблица 1.2
----> Таблица 1.3
----> Таблица 1.4
-> Таблица 2
----> Таблица 2.1
----> Таблица 2.2
-> Таблица 3
----> Таблица 3.1
----> Таблица 3.2
----> Таблица 3.3
-> Таблица 4
-> Таблица 5
-> Таблица 6

Сейчас эта функция вообще ни фига не делает. Она не работает.

Спустя 3 часа, 6 минут, 18 секунд (4.05.2010 - 13:20) Kukaramba написал(а):
В общем суть вопроса такая - что нужно написать в tablica.php например, чтобы у меня получилась структура типа tree....

Спустя 21 час, 29 минут, 20 секунд (5.05.2010 - 10:49) Kukaramba написал(а):
Уря. Получилось! Теперь только осталось сделать сворачивающийся список.


// open a connection to the database server 
$link = pg_pconnect("host=$host dbname=$db user=$user password=$pass");
if (!$link)
{
die("Could not open connection to database server");
}




function ShowTree($ParentID, $lvl) {

global $link;
global $lvl;
$lvl++;

$sSQL = "SELECT id,note,id_parent FROM project WHERE id_parent=".$ParentID." ORDER BY id_parent";
$result = pg_query($link, $sSQL) or die("Error in query: $sSQL.
"
. pg_last_error($link));;

if (pg_num_rows($result) > 0) {
echo("<UL>\n");
while ($row = pg_fetch_array($result) ) {
$ID1 = $row["id"];
echo("<li>\n");
echo("<A HREF=\""."?ID=".$ID1."\">".$row["note"]."</A>"." \n");
ShowTree($ID1, $lvl);
$lvl--;
}
echo("</UL>\n");
}

}


ShowTree(0, 0);



Спустя 4 часа, 37 минут, 21 секунда (5.05.2010 - 15:27) Kukaramba написал(а):
Как можно сделать этот список под вид проводника? Чтобы древовидность была...

Спустя 15 часов, 55 минут, 54 секунды (6.05.2010 - 07:23) Kukaramba написал(а):
Ограничения на вывод "подкаталогов", думаю, лучше поставить в запросе. При постановке ограничения в php - база будет прогружаться довольно долго, мне кажется....

Спустя 2 года, 3 месяца, 15 дней, 4 часа, 38 минут, 8 секунд (21.08.2012 - 12:01) dron4ik написал(а):
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.