Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] problem z zwracaniem danych z funkcji
patryk9200
post
Post #1





Grupa: Zarejestrowani
Postów: 319
Pomógł: 4
Dołączył: 7.02.2009
Skąd: pless

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


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ę...

Ten post edytował patryk9200 27.08.2009, 19:33:56
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 27.08.2009, 00:39:26
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  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.

Ten post edytował wookieb 27.08.2009, 07:49:03
Go to the top of the page
+Quote Post
Pawel_W
post
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


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 (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował Pawel_W 27.08.2009, 08:23:24
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Czyszczenie $result nie jest wymagane (IMG:style_emoticons/default/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>


Ten post edytował thek 27.08.2009, 08:25:00
Go to the top of the page
+Quote Post
potreb
post
Post #6





Grupa: Zarejestrowani
Postów: 1 568
Pomógł: 192
Dołączył: 7.03.2005
Skąd: Warszawa

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


Zainteresuj się opcją http://nospor.pl/grupowanie-wynikow-n35.html ~nospora, zamiast tworzyć wiele zapytań.
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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? (IMG:style_emoticons/default/tongue.gif)

Ten post edytował thek 27.08.2009, 09:17:45
Go to the top of the page
+Quote Post
patryk9200
post
Post #8





Grupa: Zarejestrowani
Postów: 319
Pomógł: 4
Dołączył: 7.02.2009
Skąd: pless

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


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? (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Spawnm
post
Post #9





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Proszę poprawić tytuł na bardziej sensowny.
Go to the top of the page
+Quote Post
wookieb
post
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




bo return konczy działanie funkcji...
Go to the top of the page
+Quote Post
thek
post
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/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ę (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
patryk9200
post
Post #12





Grupa: Zarejestrowani
Postów: 319
Pomógł: 4
Dołączył: 7.02.2009
Skąd: pless

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


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?
Go to the top of the page
+Quote Post
wookieb
post
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No a CO ZWRACASZ?
Go to the top of the page
+Quote Post
patryk9200
post
Post #14





Grupa: Zarejestrowani
Postów: 319
Pomógł: 4
Dołączył: 7.02.2009
Skąd: pless

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


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. .....
Go to the top of the page
+Quote Post
wookieb
post
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
thek
post
Post #16





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 13:40