powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) perl+ms sql создание дерево меню из данных sql
25 сообщений из 25, страница 1 из 1
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067090
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть база в sql, в ней 7 таблиц которые отвечают за 7 разных меню.
нужно на перле написать запрос \или не запрос\ для вывода меню, но в виде дерева

menu1
|-submenu1
|-submenu2
|--submenu21
....
|-submenuN
...
menu2
|-submenuN
...
|----submenu3

и так далее...
какие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на меню
Код: plaintext
1.
2.
$url_menu = $Data{'url_menu'};
$menu = $Data{'menu'};
print "<a href=$url_menu>$menu</a>";
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067098
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
vidoqкакие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на менюВариант 1. Добавить поле parent_id (id родителя)
Вариант 2. Nested sets - http://www.getinfo.ru/article610.html + http://www.getinfo.ru/article689.html
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067119
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
про parent_id все понятно! мне сразу так сказали сделать!
просто я понять не могу как это сделать!!!
добавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!

Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067179
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
vidoqдобавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!Бред какой.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067234
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.
блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...

*Бред какой.
да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067298
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
vidoq *А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.
блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...Начинать надо с простого. Вам похоже вообще программирование пока не знакомо. А вы сразу за такие дела берётесь. *Бред какой.да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!А там что, не на perl'е примеры? И если есть встроенные - так используйте - сюда то зачем пришли? Носом в мануал - и вперёд, использовать встроенные функции.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33067303
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
И вообще по первой ссылке приведена теория. На чём вы её будете реализовывать (хоть на BC++) - никакого значения не имеет.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33069831
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добавил поле parent и еще одно level
parent - к кому принадлежит
level - глубина меню

далее хотелось использовать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from menu where parent='$parent' and level='$level' order by parent, level

далее подключаем базу ... загоняем строки в хэшь.

далее я пишу
$x = $parent <=  0 ;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; #простая таблица выводит порядковый номер, название меню и к кому меню пренадлежит если  0  то меню главное если  1  то подглавное ... итд...

print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
retrun $x;
} else { retrun $x- 1 *$x;

}

в конце концов он мне выводит первую строчку из базы вида
(1)название меню(0)
и все, + в отладке пишет что неможет передовать $x... вроде как я понял!!!

что добавить как доработать?
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33070984
BonJorno
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а лучше зайди в ветку mssql, там этого добра много обсуждается. А perl тут вобщем-то сбоку-припёку. Грамотная процедура выдаст тебе меню в любом виде, а клиент может быть любой.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33070996
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет я конечно понимаю, просто с запросом то чего и откуда брать как сортировать у меня все впорядке.
а вот perl то как раз мне больше нужен чем mssql.
запрос то из перла делать, знал бы как делать вопросов бы не было!
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33070997
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у менян тут опечатка в коде
нужно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from menu where parent='$parent' and level='$level' order by parent, level

...

$x = $parent <=  0 ;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; 
print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
return $x;
} else { return ($x- 1 )*$x;

}

...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33071338
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#!!!!
# select * from menu order by parent, level
#!!!!
my @top;
my %recs;
while($O->FetchRow()){
        my %Data = $O->DataHash();
        my $dataRef=\%Data;
        my $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach my $dataRef (values %recs){
        my $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
#id - уникальный номер
#parent - родитель \верхний = 0  т.к. он без родителя\
#url_menu - ссылка на меню
#menu - название меню
print "<ol>";
for my $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        my $menu=shift;
        my %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}


---
"Raffiniert ist der Herr Gott, aber boshaft ist Er nicht." Albert Einstein
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33071770
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересное кино, скрипт поставил -> спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
----------------
начало скрипта
----------------
#connecting to sql server -> to database
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

$O->Sql("select * from menu where parent='$parent' order by parent, level");
@top;
%recs;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach $dataRef (values %recs){
        $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
print "<ol>";
for $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        $menu=shift;
        %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}

но проблема в том что он не отображает меню как надо!

он отображает в виде:
1. Технико-экономическое планирование
2. Технико-экономическое планирование
3. Технико-экономическое планирование
4. Технико-экономическое планирование
5. Технико-экономическое планирование
6. Технико-экономическое планирование
7. Технико-экономическое планирование

причем само "Технико-экономическое планирование" - стоит в id=42 \это самое последнее меню\
а вед до id=42 есть еще меню. Хотя кол-во определенно верно (7).

но и под меню еще не выводятся..(((
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33071828
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшой bugfix:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$O->Sql("select * from menu order by parent, level");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
foreach $id (@all_ids ){
        $dataRef=$recs{$id}
        $parent=$dataRef->{parent};
        if(defined $recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }
}
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33071841
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё bugfix:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33072308
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал все как ты написал!
только вот проблемка...

когда он выводит меню, то он выводит все id начиная с 1 до 49 \их всего столько\
причем 1-7 меню он выводит нормально, со всеми подменю...
а остальные он начинает новый рекурсивный запрос, и занова проходится по id хотя берет он их уже с parent - вроде.
я думал как бы все это сделать, так и не додумал..(((
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33073169
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ляпни сюда аттачментом архив с полным кодом скрипта + пример вывода.
А то, блин, игра "черный ящик" получается :)
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33073595
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот держи, описалово внутри!
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33073884
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу глюков сравнения - надо локальные переменные объявлять как my
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33074483
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин а ты прав)
спасибо.
только вот проблема то та осталась, он все равно выводит мне меню равно всем id из базы!
т.е. меню то отображается все \ну ты видел\
а вот дальше уже идет зацикливание и выводятся все остальные ид...(((
как сделать? смотрели смотрели на скрипт, короче ничегог плохого в нем не увидели. в базе тоже все отлично, левых ссылок и ссылок на самого себя нет.
короче не знаем что и делать.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33074534
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я протупил. Нужно чуть исправить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
#!!!!!
        if(ref $recs{$parent}){ #!!!! тут я ошибся :(
#!!!!
               push @{$recs{$parent}->{children}}, $dataRef;
        }
}
Приношу извинения за столь глючные решения :(
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33074773
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да не насчет глючных - это пустяки!
а вот то что он все равно не работает .... это да)))
bugfix не помог, может что то другое в нем поменять?
все равно также выводит огромное меню....(((
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33074825
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
       print "<li><a href=test.pl?current=$hash{id}&depth=2>$hash{menu}</a>";
Смысл:
current - какое подменю развернуть
depth - как глубоко - сколько подуровней показывать

P.S. Вот эта строка if(ref $recs{$parent}){ должна была привести к выводу только 7 корневых пунктов.
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33074838
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё fix:
Код: plaintext
push @top, $dataRef unless ($dataRef->{parent});
...
Рейтинг: 0 / 0
(Perl) perl+ms sql создание дерево меню из данных sql
    #33075061
vidoq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СУПЕР!!!
все стало нормально работать!!!
СПАСИБО тебе ХМ:)

база - id, parent, url_menu, menu
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
если кому то нужен код общий вот он:
------------------------------------
use Win32::ODBC ;
use CGI ;
$q = new CGI ;

print <<EOF ;   
Content-type: text/html\n\n
<html>
<head>
<title>site map axion.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
	background-image: url(http://www.axion.com/samples/images/backgrnd.gif);
}
.style5 {font-size: 14px}
.style8 {
	color: # 000000 ;
	font-weight: bold;
}
.style9 {color: # 990000 }
.style10 {font-weight: bold}
.style11 {color: # 990000 ; font-weight: bold; }
.style12 {font-size: 18px; font-weight: bold; }
.style13 {color: # 660000 }
-->
</style></head>
<body>
EOF

#connecting to sql server -> to database----------------------------------------------------------------#
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

#creating menu------------------------------------------------------------------------------------------#
$O->Sql("select * from menu order by parent");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef->{parent});
        push @all_ids, $id;
}

foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
        if(ref $recs{$parent}){
        push @{$recs{$parent}->{children}}, $dataRef;
        }
}

#menu---------------------------------------------------------------------------------------------------#
print "<ol>";
for $menu (@top){
    out_menu($menu);
}
print "</ol>";

sub out_menu{
    my $menu=shift;
    my %hash=%{$menu};

       print "<li><a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) perl+ms sql создание дерево меню из данных sql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]