Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL] Menu, submenu, subsubmenu, subsubmenu, Dynamicznie z bazy danych
Blajo
post 3.07.2008, 20:11:58
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Potrzebuję zrobić menu kategorii i podkategorii wyciąganych z bazy danych o strukturze

id_menu | nazwa | rodzic

id_menu - wiadomo
nazwa - wiadomo
rodzic - id_menu rodzica

Napisałem, działa i jest OK. Ale są na sztywno zaimplementowane 3 poziomy. Więc mam pytanie jak to napisać, żeby dynamicznie sam wyświetlał wszystkie menu i podmenu? Nawet w przypadku, kiedy będzie 20 podmenu?

Efekt jaki chcę osiągnąć:

1
-1.1
-1.2
-1.3
--1.3.1
--1.3.2
--1.3.3
-1.4
2
-2.1
-2.2
3
4
5
-5.1
-5.2

Ale podmenu dopiero widoczne po kliknięciu. Wersja online znajduje się pod adresem www.iseasy.pl/menu.php

A oto kod pisany "na sztywno".

  1. <?php
  2.  
  3. mysql_connect("localhost", "root", "");
  4.  
  5. $zapytanie = "SELECT * FROM menu WHERE rodzic = 0";
  6. $pobierz = mysql_query($zapytanie);
  7.  
  8. ?>
  9. <p><a href="menu.php">menu</a></p>
  10. <ul>
  11. <?php
  12.  
  13. while( $dane = mysql_fetch_array($pobierz) )
  14. {
  15.  echo "<li><a href='menu.php?id=".$dane['id_menu']."'>".$dane['nazwa']."</a></li>";
  16.  if( $dane['id_menu'] == $_GET['id'] )
  17.  {
  18. $zapytanie2 = "SELECT * FROM menu WHERE rodzic = $_GET[id]";
  19. $pobierz2 = mysql_query($zapytanie2);
  20. echo "<ul>";
  21. while( $dane2 = mysql_fetch_array($pobierz2) )
  22. {
  23.  echo "<li><a href='menu.php?id=".$dane['id_menu']."&id2=".$dane2['id_menu']."'>".$dane2['nazwa']."</a></li>";
  24.  if( $dane2['id_menu'] == $_GET['id2'] )
  25.  {
  26.  $zapytanie3 = "SELECT * FROM menu WHERE rodzic = $_GET[id2]";
  27.  $pobierz3 = mysql_query($zapytanie3);
  28.  echo "<ul>";
  29.  while( $dane3 = mysql_fetch_array($pobierz3) )
  30.  {
  31.  echo "<li><a href='menu.php?id=".$dane['id_menu']."&id2=".$dane2['id_menu']."'>".$dane3['nazwa']."</a></li>";
  32.  }
  33.  echo "</ul>";
  34.  }
  35. }
  36. echo "</ul>";
  37.  }
  38. }
  39. ?>
  40. </ul>


Liczę na pomoc w rozwiązaniu tego problemu.


--------------------
tutoriale
Go to the top of the page
+Quote Post
phpion
post 3.07.2008, 20:15:31
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Rekurencja to słowo klucz. Piszesz funkcję, która pobiera wszystkie podkategorie (1 poziom) należące do rodzica, czyli WHERE rodzic=$x. Główne kategorie powinny mieć rodzica ustawionego na NULL czyli startujesz od WHERE rodzic IS NULL. Następnie przelatujesz wybrane rekordy i wywołujesz rekurencyjnie funkcję jeszcze raz, tym razem jako parametr podając rodzica aktualnie iterowanego elementu. To w zasadzie tyle. DO tego odpowiednie umiejscowienie <ul> oraz <li> i osiągniecz oczekiwany efekt. Powodzenia!

PS: takie menu jak zaprezentowałeś w linku lepiej zrobić w JS wykorzystując kod wygenerowany przez PHP (na podstawie pomysłu podanego powyżej).

Ten post edytował phpion 3.07.2008, 20:16:58
Go to the top of the page
+Quote Post
Blajo
post 3.07.2008, 20:31:20
Post #3





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Nie, musi być na PHP.

A coś więcej? jakiś przykład?


--------------------
tutoriale
Go to the top of the page
+Quote Post
phpion
post 3.07.2008, 20:56:42
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie jesteś w stanie napisać funkcji, która wyszukuje rekordy o konkretnej wartości rodzica? Nie jesteś w stanie wywołać funkcji jeszcze raz z wnętrza samej siebie? No bez przesady, kombinuj.
Go to the top of the page
+Quote Post
Blajo
post 3.07.2008, 22:08:17
Post #5





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. function rysuj_menu($rodz)
  4. {
  5.  $zapytanie = "SELECT * FROM menu WHERE rodzic = $rodz";
  6.  $pobierz = mysql_query($zapytanie);
  7.  
  8.  echo "<ul>";
  9.  while( $dane = mysql_fetch_array($pobierz) )
  10.  {
  11.  
  12. echo "<li><a href='menu.php?id=".$dane['id_menu']."'>".$dane['nazwa']."</a></li>";
  13. if( $dane['id_menu'] == $_GET['id'] )
  14. {
  15.  echo rysuj_menu($_GET['id'],2);
  16.  
  17. }
  18.  }
  19.  echo "</ul>";
  20. }
  21.  
  22. echo rysuj_menu(0);
  23. ?>


Coś w tym kierunku? Niestety nie spełnia oczekiwanej funkcjonalności...


--------------------
tutoriale
Go to the top of the page
+Quote Post
Piotrwusek
post 3.07.2008, 22:48:06
Post #6





Grupa: Zarejestrowani
Postów: 399
Pomógł: 7
Dołączył: 11.06.2007
Skąd: Poznan

Ostrzeżenie: (20%)
X----


rekrutacją

funkcja wywałana w funckji z jakimś ogranicznikiem
Go to the top of the page
+Quote Post
chlebik
post 4.07.2008, 01:21:21
Post #7





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

Ostrzeżenie: (0%)
-----


Dla szybkosci generowania takiego menu unikalbym rekurencji z ponownie wywolywanym zapytaniem do bazy - wystarczy, ze masz 5 poziomow i juz zaczyna sie to przycinac. Nie lepij po prostu wrzucic zapytanie do bazy i zrobic ORDER na id_rodzica questionmark.gif Potem po prostu to wyswietlic z IFem jesli trzeba.


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
Blajo
post 4.07.2008, 06:34:46
Post #8





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Więc można prosić o przykłady?


--------------------
tutoriale
Go to the top of the page
+Quote Post
antyqjon
post 4.07.2008, 08:37:39
Post #9





Grupa: Zarejestrowani
Postów: 77
Pomógł: 27
Dołączył: 24.03.2002
Skąd: Tarnów

Ostrzeżenie: (0%)
-----


http://kapelak.pl/2008/04/04/drzewa-w-mysql/

http://dev.mysql.com/tech-resources/articl...hical-data.html

Poczytaj, może naprowadzi Cię na nieco ciekawsze rozwiązanie.


--------------------
Zbyszek 'antyqjon' Siciarz

siciarz.net | Aquila DSP C++
Go to the top of the page
+Quote Post
Blajo
post 15.07.2008, 10:17:09
Post #10





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Wszystko przeglądałem, i wszystko jest takie same.
Wypisywanie struktury bez możliwości klikania i przekazywania parametrów co ma zostać rozwinięte.


  1. <?php
  2.  
  3.  
  4. function sideNodes($addr)
  5. {
  6. $query = "SELECT * FROM menu WHERE rodzic = $addr";
  7. $result = mysql_query($query);
  8.  
  9.  
  10. while ($row = mysql_fetch_array($result))
  11. {
  12. echo "<li>";
  13. echo "<a href=?id=".$row['id_menu'].">".$row['nazwa']."</a>";
  14. echo "</li>";
  15. }
  16.  
  17. }
  18.  
  19.  
  20. function treeView($addr)
  21. {
  22. if ($addr == 0) 
  23. {
  24. sideNodes($addr);
  25. return;
  26. }
  27.  
  28. $query = "SELECT * FROM menu WHERE id_menu = $addr";
  29. $result = mysql_query($query);
  30.  
  31. $row = mysql_fetch_array($result);
  32.  
  33. echo '<ul>';
  34. treeView($row['rodzic']);
  35. echo '</ul>';
  36.  
  37. sideNodes($addr);
  38. }
  39.  
  40.  
  41. if( !isset($_GET['id']))
  42. treeView(0);
  43. else
  44. treeView($_GET['id']);
  45.  
  46. ?>



Napisałem taką funkcję, ale nie wy wyświetla tego tak jak chcę. Wiec jak to napisac, żeby było dobrze?
Czy ktoś mi pomoże?


--------------------
tutoriale
Go to the top of the page
+Quote Post
marcinpruciak
post 15.07.2008, 20:28:16
Post #11





Grupa: Zarejestrowani
Postów: 161
Pomógł: 9
Dołączył: 14.07.2008

Ostrzeżenie: (0%)
-----


Jeszcze aktualne?

też się z tym męczyłem udało mi się osiągnąć taki efekt:

http://195.205.202.32:6893/Szablon/index.php?id=home

O to chodziło?

Zrobiłem to takim kodem:

  1. <?php
  2. $lacz=lacz_bd();
  3.  $zapytanie="select * from strony where rodzic=''";
  4.  $wynik=$lacz->query($zapytanie);
  5.  
  6. ...
  7.  
  8. while($rzad = mysqli_fetch_assoc($wynik))
  9.    {
  10.   echo '<li><a href="index.php?id='.$rzad['id'].'">'.$rzad['tytul_menu'].'</a></li>';
  11.   submenu($rzad['id']);
  12.   }
  13. ?>





  1. <?php
  2. function submenu($id)
  3. {
  4.  $lacz=lacz_bd();
  5.  $zapytanie2="select * from strony where rodzic='$id'";
  6.  $wynik2=$lacz->query($zapytanie2);
  7.  
  8.   while($rzad2=mysqli_fetch_array($wynik2))
  9.   {
  10.   echo $rzad2['tytul_menu'];
  11.   }
  12. }
  13. ?>


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 1.05.2025 - 04:19