Необходимо вывести структурное меню (типа 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
Помогите сделать эту менюшку. Я уже весь интернет облазил....
Спустя 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 запросе |
А в таком случае мне непонятно, что же тут непонятного
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 написал(а):
Каким образом можно включить запрос типа
В 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);
В php код для моей БД, и чтобы работало? Просто я понимаю что здесь есть ошибки, но где именно - для меня загадка.
Спустя 4 минуты, 32 секунды (4.05.2010 - 00:06) sergeiss написал(а):
Глубоко не вникал, но вот тут
однозначная ошибка, т.к. это присвоение, а не сравнение. И если $lvl не равно нулю, то получаем вечный цикл.
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) |
Думаю здесь идет сравнение. |
Правильно думаешь... А сравнение как пишется в ПХП, какие возможны варианты?
Спустя 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
}
Так??
{
$row['level'] = $lvl
}
Так??
Спустя 1 минута, 29 секунд (4.05.2010 - 00:43) sergeiss написал(а):
<тут была длинная фраза, вырезанная цензурой по причине нецензурности этой фразы....>
Скачай хэлп из моей подписи. И найди там операторы сравнения!!!
Скачай хэлп из моей подписи. И найди там операторы сравнения!!!
Спустя 8 минут, 54 секунды (4.05.2010 - 00:52) Kukaramba написал(а):
понял причину цензуры....
$row['level'] !== $lvl
так??
$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
так вроде логичнее....
$row['level'] <= $lvl
так вроде логичнее....
Спустя 23 минуты, 16 секунд (4.05.2010 - 01:21) Kukaramba написал(а):
Пишет ошибку Вообще страницу открыть не может....
Спустя 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
Сейчас эта функция вообще ни фига не делает. Она не работает.
-> Таблица 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 написал(а):
http://amatar.by/news-view-476.html по сути то)