Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] problem z zwracaniem danych z funkcji
Forum PHP.pl > Forum > Przedszkole
patryk9200
Cześć,
stworzyłem pewną funkcję która pobiera dane z bazy i na ich podstawie buduje menu, jak zrobić żeby zwracała mi kod gdy użyję jej np. tak:
  1. $top = Menu();

funkcja:
  1. function Menu ()
  2. {
  3.  
  4. $db['name']="zs4tychy";
  5. $db['prefix']="new_";
  6. $page = 1;
  7. $link = mysql_connect("".$db['host']."", "".$db['user']."", "".$db['pass']."") or die ("Nie można się połączyć");
  8. mysql_select_db ("".$db['name']."") or die ("Nie mozna wybrać bazy danych");
  9.  
  10. $query = "SELECT * FROM ".$db['prefix']."menu WHERE submenu='0' AND page='".$page."' ORDER BY position DESC";
  11. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem1");
  12.  
  13. while($rek = mysql_fetch_array($result))
  14. {
  15. $return = '<ul>';
  16. $return .= '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';
  17. if ($rek['parent'] == TRUE)
  18. {
  19. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek['id']."' AND submenu='1' AND page='".$page."' ORDER BY position DESC";
  20. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem2");
  21. if ($rek['parent'] == TRUE)
  22. {
  23. while($rek = mysql_fetch_array($result))
  24. {
  25. $return .= '<ul>';
  26. $return .= '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';
  27. if ($rek['parent'] == TRUE)
  28. {
  29. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek['id']."' AND submenu='2' AND page='".$page."' ORDER BY position DESC";
  30. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem3");
  31. while($rek = mysql_fetch_array($result))
  32. {
  33. $return .= '<ul>';
  34. $return .= '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';
  35. $return .= '</ul>';
  36. }
  37.  
  38. }
  39. $return .= '</ul>';
  40. }
  41. }
  42. }
  43. $return .= '</ul>';
  44. }
  45.  
  46. mysql_close($link);
  47. return $return;
  48. }

Tak mi zwraca tylko 1 pozycję...
thek
Powiem tylko 2 słowa: nadpisywanie zmiennych

Wywalasz do bazy wiele zapytań, ale skrypt szybko działa bo w każdej pętli do zmiennej $result i $rek wpisujesz wyniki kolejnych podzapytań oraz przebiegów pętli, co sprawia, że dochodzi do najgłębszego podzapytania, wykonuje je i we wszystkich nadrzędnych do niego WHILE następuje wyjście z pętli. Wystarczy, że zmienne $result i $rek ponazywasz jak tam chcesz, byle na różnych poziomach zagłębień były inne i wszystko zadziała jak trzeba.
wookieb
  1. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem1");
  2.  
  3. $return = '';
  4. while($rek = mysql_fetch_array($result))
  5. {
  6. $return .= '<ul>';
  7.  


Oraz to co powiedział, kolega wyżej.
Pawel_W
eee
co to jest?
  1. $link = mysql_connect("".$db['host']."", "".$db['user']."", "".$db['pass']."") or die ("Nie można się połączyć");

nie można tak?
  1. $link = mysql_connect($db['host'], $db['user'], $db['pass']) or die ("Nie można się połączyć");


?

edit:
nadpisywania nie komentuje, nie będę cię dołował, masz to @up winksmiley.jpg
thek
Czyszczenie $result nie jest wymagane smile.gif To zmienna widoczna tylko w zasięgu funkcji, więc przy każdym nowym jej wywołaniu jest tworzona na nowo, a więc automatycznie się "resetuje".
Ja się tylko zastanawiam jaki jest sens Tworzenia tylu list... Nie lepiej było zrobić otwarcie listy PRZED pętlą a jej zamknięcie PO? W tej chwili bowiem, nawet gdy nie ma się nic więcej niż menu główne, to tworzy coś takiego:
  1. <ul>
  2. <li><a href="link">nazwa</a></li>
  3. </ul>
  4. <ul>
  5. <li><a href="link">nazwa</a></li>
  6. </ul>
  7. <ul>
  8. <li><a href="link">nazwa</a></li>
  9. </ul>
potreb
Zainteresuj się opcją http://nospor.pl/grupowanie-wynikow-n35.html ~nospora, zamiast tworzyć wiele zapytań.
thek
Przy okazji... Jeśli miałbym się bawić w budowanie wielokrotnie zagnieżdżonych menu to raczej bym tabelę w bazie zmienił. Jedna tabela z polami: id_węzła, nazwa, root (domyślnie 0) i inne jakie Ci potrzebne. Dlaczego?
Bo wszystko co ma root = 0 jest elementem głównego menu, a to co ma tam liczbę jest submenu podpiętym do pola o id równym id_węzła. Można więc zrobić nie wiem jak głębokiee zagnieżdżenia. Co prawda odbywa się to kosztem pisania kodu nieco bardziej skomplikowanego (rekurencja), ale kto powiedział, że życie jest łatwe? tongue.gif
patryk9200
Cytat(thek @ 27.08.2009, 10:16:45 ) *
Przy okazji... Jeśli miałbym się bawić w budowanie wielokrotnie zagnieżdżonych menu to raczej bym tabelę w bazie zmienił. Jedna tabela z polami: id_węzła, nazwa, root (domyślnie 0) i inne jakie Ci potrzebne. Dlaczego?
Bo wszystko co ma root = 0 jest elementem głównego menu, a to co ma tam liczbę jest submenu podpiętym do pola o id równym id_węzła. Można więc zrobić nie wiem jak głębokiee zagnieżdżenia. Co prawda odbywa się to kosztem pisania kodu nieco bardziej skomplikowanego (rekurencja), ale kto powiedział, że życie jest łatwe? tongue.gif


jeśli chodzi o tabelę root, to taką samą funkcję spełnia submenu, domyślnie ma wartość 0, a menu jest tak skonstruowane, że moge zrobić maksymalnie 3 zagnieżdżenia dlatego submenu może mieć tylko wartości 1,2 lub 3. tabela pid to id rodzica submenu.

poprawiłem trochę funkcje bo jak ktoś wcześniej zwrócił uwagę zawierała błąd, próbowałem zrobić tak, że każdy stopień miał swoje zmienne z których na koniec wartości zwracała funkcja, ale mi to nie działało.
Teraz mam coś takiego:
  1. function Menu ()
  2. {
  3. $db['host']="sql.nazwa.pl";
  4. $db['user']="z";
  5. $db['pass']="n";
  6. $db['name']="y";
  7. $db['prefix']="new_";
  8. $page = 1;
  9. $link = mysql_connect("".$db['host']."", "".$db['user']."", "".$db['pass']."") or die ("Nie można się połączyć");
  10. mysql_select_db ("".$db['name']."") or die ("Nie mozna wybrać bazy danych");
  11.  
  12. $query = "SELECT * FROM ".$db['prefix']."menu WHERE submenu='0' AND page='".$page."' ORDER BY position DESC";
  13. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  14.  
  15. while($rek = mysql_fetch_array($result))
  16. {
  17. return '<ul>';
  18.  
  19. if ($rek['parent'] == TRUE)
  20. {
  21. $poziom1= '<li><span class="dir">'.$rek['name'].'</span><ul>';
  22. if ($rek['parent'] == TRUE)
  23. {
  24. return '<li><span class="dir">'.$rek['name'].'</span><ul>';
  25. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek['id']."' AND submenu='1' AND page='".$page."' ORDER BY position DESC";
  26. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  27. while($rek = mysql_fetch_array($result))
  28. {
  29. if ($rek['parent'] == TRUE)
  30. {
  31. return '<li><span class="dir">'.$rek['name'].'</span><ul>';
  32. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek['id']."' AND submenu='2' AND page='".$page."' ORDER BY position DESC";
  33. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  34. while($rek = mysql_fetch_array($result))
  35. {
  36. return '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';
  37. }
  38. return '</ul></li>';
  39. } else {return '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';}
  40. }
  41. return '</ul></li>';
  42. } else {return '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';}
  43. $poziom1e= '</ul></li>';
  44. } else
  45. {
  46. $poziom1 '<li><a href="'.$rek['link'].'">'.$rek['name'].'</a></li>';
  47. }
  48. return $poziom1.$poziom1e;
  49. return = '</ul>';
  50. }
  51.  
  52. mysql_close($link);
  53. }

ale nie wiem dlaczego ale żadne pętle sie nie wykonują, strukturę bazy mam taką:

id pid page link name submenu parent position


1 1 1 # Treść 0 0 1


2 1 1 # Artykuły 1 1 1


3 2 1 # Najnowsze 2 1 1


4 1 1 newsy.php News 0 0 1
Spawnm
Proszę poprawić tytuł na bardziej sensowny.
wookieb
bo return konczy działanie funkcji...
thek
Jak byk napisałem... zmień nie tylko $result, ale i $rek... Co pętlę bowiem wiersze masz wpisywane do $rek... Je też musisz odróżnić od siebie bo one także się nadpisują.
Ja w przykładzie nie mam tabeli root. To tylko jedna kolumna na podstawie jakiej ustalam jaki węzeł z jakim węzłem się łączy. Nie potrzebuję do tego 3 kolumn smile.gif
1 główna 0
2 Forum 0
3 Galeria 0
4 Galeria Ani 3
5 Galeria Basi 3
Jak widzisz taki układ oznacza dla mnie tyle, że węzły 4 i 5 są dziećmi węzłe 3 i mam z nich dla węzła 3 zrobić submenu. W ten sposób mogę zagnieżdżać na dowolną głębokość submenu, tworząc z rekordów drzewo. Czyli mam o wiele mniejszym kosztem objętości bazy to co Ty o ile dobrze widzę.

Return jak wspomniano kończy działanie funkcji więc nic nie zwrócisz w zasadzie poza tagiem otwierającym listę winksmiley.jpg
patryk9200
napisałem funkcję od nowa i teraz zwraca mi tylko "1" i nic więcej co jest źle?
  1. function Menu ()
  2. {
  3. $db['host']="";
  4. $db['user']="";
  5. $db['pass']="";
  6. $db['name']="";
  7. $db['prefix']="new_";
  8. $page = 1;
  9.  
  10. $menuStart = '<div><div id="ContentBelka">'.$title.'</div><div id="ContentKontener">
  11. <div style="height:258px">
  12. <ul id="nav" class="dropdown dropdown-vertical" style="width:140px; z-index: 90;">';
  13.  
  14. $link = mysql_connect("".$db['host']."", "".$db['user']."", "".$db['pass']."") or die ("Nie można się połączyć");
  15. mysql_select_db ("".$db['name']."") or die ("Nie mozna wybrać bazy danych");
  16. $query = "SELECT * FROM ".$db['prefix']."menu WHERE submenu='0' AND page='".$page."' ORDER BY position DESC";
  17. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  18. while($rek1 = mysql_fetch_array($result))
  19. {
  20. if ($rek1['parent'] == TRUE)
  21. {
  22. $menu1 = '<li><span class="dir">'.$rek1['name'].'</span><ul>';
  23. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek1['id']."' AND page='".$page."' ORDER BY position DESC";
  24. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  25. while($rek2 = mysql_fetch_array($result))
  26. {
  27. if ($rek2['parent'] == TRUE)
  28. {
  29. $menu2 = '<li><span class="dir">'.$rek2['name'].'</span><ul>';
  30. $query = "SELECT * FROM ".$db['prefix']."menu WHERE pid='".$rek2['id']."' AND page='".$page."' ORDER BY position DESC";
  31. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  32. while($rek3 = mysql_fetch_array($result))
  33. {
  34. $menu3 = '<li><a href="'.$rek3['link'].'">'.$rek3['name'].'</a></li>';
  35. }
  36. $menu2e = '</ul></li>';
  37. } else
  38. {
  39. $menu2 .= '<li><a href="'.$rek2['link'].'">'.$rek2['name'].'</a></li>';
  40. }
  41.  
  42. }
  43. $menu1e = '</ul></li>';
  44. } else
  45. { $menu1 .= '<li><a href="'.$rek1['link'].'">'.$rek1['name'].'</a></li>';
  46. }
  47. }
  48.  
  49. $menuEnd = '</ul></div></div>';
  50. $t = $menuStart.$menu1.$menu2.$menu3.$menu2e.$menu1e.$menuEnd;
  51. return
  52. mysql_close($link);
  53.  
  54. }


czy dobrze zrobiłem z tymi zmiennymi?
wookieb
No a CO ZWRACASZ?
patryk9200
no dobra dałem
  1. return $t;
i zwróciło mi coś takiego:
  1. <div id="ContentBelka">Menu</div><div id="ContentKontener">
  2. <div style="height: 258px;">
  3. <ul id="nav" class="dropdown dropdown-vertical" style="width: 140px; z-index: 90;"><li><span class="dir">Tre��</span><ul><li><span class="dir">Tre��</span><ul><li><a href="newsy.php">News</a></li></ul></li></ul></li></ul></div></div>
  4.  



a tablela w bazie wygląda tak:
id pid page link name submenu parent position


1 1 1 # Treść 0 1 1


2 1 1 # Artykuły 1 1 1


3 2 1 # Najnowsze 2 0 1


4 1 1 newsy.php News 0 0 1

powinna mi się taka struktura budować:
  1. <ul id="nav" class="dropdown dropdown-horizontal">
  2. <li><a href="./">Strona głowna</a></li>
  3. <li><span class="dir">Strony tematyczne</span>
  4. <ul>
  5. <li><a href="./">Historia</a></li>
  6. <li><a href="./">Matematyka</a></li>
  7. <li><span class="dir">Angielski</span>
  8. <ul>
  9. <li><a href="./">począkujacy</a></li>
  10. <li><a href="./">John</a></li>
  11. <li><a href="./">Michael</a></li>
  12. <li><a href="./">Peter</a></li>
  13. <li><a href="./">Sarah</a></li>
  14. </ul>
  15. </li>
  16. <li><a href="./">Clients</a></li>
  17. <li><a href="./">Testimonials</a></li>
  18. <li><a href="./">Press</a></li>
  19. <li><a href="./">FAQs</a></li>
  20. </ul>
  21. </li>
  22. .....
wookieb
widać ze nie dociera do ciebie co pisali koledzy wyżej więc powstawiaj sobie echo w każdą pętlę, która wyświetli ci aktualna zawartość menu, aż dotrzesz do rozwiązania.
thek
Błąd 1: czemu nadal i namiętnie nadpisujesz zmienną $result?
Błąd 2: czemu w bezsensowny sposób tworzysz menu PO wykonaniu wszystkich pętli? W pierwszym swoim kodzie z łączeniem na bieżąco kodu w zmiennej $return było robione to tak jak chciałeś.

Na dogłębne szukanie błędów nie mam teraz głowy, bo za śpiący jestem winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.