Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Pętla w pętli
Forum PHP.pl > Forum > Przedszkole
glaacier
Witam,

Mam oto taki problem. Jest tabela, któa wygląda następująco:


id, nazwa, pod, podnr

Rerokrdy w tej tabeli to wpisy menu z dwoma poziomami. Pierwszy poziom wyglada następująco:

id 1
nazwa JEDEN
pod 0
podnr 1 - taki sam jak id

Drugi poziom menu wygląda następująco:

id 2
nazwa JEDEN.1
pod 1
podnr 1


Zaciągam więc z tabeli wyniki:

Tak wygląda mój kod:


  1.  
  2. <ul>
  3.  
  4. <?
  5.  
  6. require_once("connect.php");
  7. $result = mysql_query("SELECT * FROM newsy WHERE cat=18 AND pod=0 ORDER BY poz", $con);
  8. if (!$result) {
  9. die('Problem: ' . mysql_error());
  10. }
  11.  
  12.  
  13. while ($row = mysql_fetch_array($result)) {
  14.  
  15. $ide = $row['id'];
  16. $idepod = $row['podnr'];
  17. $tytul = $row['subject'];
  18.  
  19.  
  20.  
  21.  
  22.  
  23. $podresult = mysql_query("SELECT * FROM newsy WHERE podnr=$ide AND pod=1 ORDER BY poz", $con);
  24. if (!$podresult) {
  25. die('Problem: ' . mysql_error());
  26. }
  27.  
  28.  
  29.  
  30.  
  31. while ($rowe = mysql_fetch_array($podresult)) {
  32.  
  33. $idepodpod = $rowe['podnr'];
  34. $podwyniki = $rowe["subject"];
  35. $podwyniki = "<li><a href=\"#\">$podwyniki $idepodpod</a></li>";
  36. }
  37.  
  38.  
  39. echo "<li><a href=podstrona.php?a=$ide&b=$ide#aktu >$tytul $ide</a>
  40.  
  41. <ul> $podwyniki </ul> </li>
  42. ";
  43.  
  44.  
  45. }
  46.  
  47. ?>
  48.  
  49.  
  50.  
  51.  
  52. </ul>
  53.  
  54.  



na czym polega problem. Otóż skrypt wykonuje pierwszą pętle while prawidłowo. Pokazuje wszystkie możliwe wyniki z tabeli, za to przy drugiej petli (tej pętli w pętli) pokazuje tylko jeden wynik, po prostu nie zapętla się tyle razy ile jest możliwych wyników w tabeli. Otrzymuje wynik taki:

JEDEN
jeden.1

DWA
dwa.1

TRZY
trzy.1

a chciałbym otrzymać:

JEDEN
jeden.1
jeden.2
jeden.3

DWA
dwa.1
dwa.2
dwa.3

TRZY
trzy.1
trzy.2
trzy.3

Będę wdzięczny za podpowiedź, co zrobić, żeby pętla druga zapętlała się tyle razy ile jest wyników w danej tabeli.
nospor
Sposób w jaki to robisz jest bardzo nie optymalny. Nie nalezy generowac zapytan w petli.
Tutaj opisałem alternatywe. Moze ci sie przyda:
http://nospor.pl/grupowanie-wynikow.html
glaacier
Niestety, nie do końca mi to pomogło, chociaż rozwiązanie jest na pewno bardzo optymalne. Otóż, w twoim przykładzie (przykład 1.) wyniki pobierane są z dwóch tabel. Pierwszy poziom menu to wyniki z tabeli kategorie a drugi poziom to produkty (jesli oczywiście dobrze wyczytałem z kodu, który jak dla mnie jest zawiły tongue.gif).

Zastanawiam się zatem, czy jest jakakolwiek możliwość, żeby stworzyć owe menu z dwoma poziomami na jednej tabeli, kiedy pierwszy i drugi poziom ma taką samą liczbę w kolumnie podnr a różnią się tym, że pierwszy poziom w kolmnie pod ma 0 a drugi poziom 1. Rozwiązanie pewnie jest i to nie jedno, jednak z moim pojęciem na temat php są one jeszcze niewyobrażalne smile.gif Zaznaczam, że przeszukałem internet i na tyle na ile moja wiedza pozwoliła wykorzystać podane rozwiązania na tyle je wykorzystałem smile.gif. Za laictwo z góry przepraszam.
tehaha
rozumiem, że chodzi Ci o wielopoziomowe menu, w takim razie jest to problem drzewka kategorii, jest kilka rozwiązań na to np. drzewko lewo praw lub drzewko IP, ja osobiście polecam drzewko IP, aczkolwiek jeżeli jesteś bardzo początkujący to może Ci się to wydać za bardzo skomplikowane.

Jeżeli masz tylko 2 poziomy czyli tylko kategorie główne i podkategorie, to najprościej byłoby dodanie kolumny podkategorie w tabeli kategorie, i trzymać tam podkategorie w postaci zserializowanej tablicy, aczkolwiek takie rozwiązanie jest bardzo nieelastyczne i uniemożliwia wiele operacji mysql.
nospor
Cytat
Otóż, w twoim przykładzie (przykład 1.) wyniki pobierane są z dwóch tabel.
Przeciez to tylko przyklad by pokazac ideę. Przeciez ta druga tabela to nic innego jak Twoja pierwsza z warunkiem na ustawiony poziom
glaacier
Cytat(nospor @ 21.12.2010, 15:29:53 ) *
Przeciez to tylko przyklad by pokazac ideę. Przeciez ta druga tabela to nic innego jak Twoja pierwsza z warunkiem na ustawiony poziom


Pokombinowałem i się udało. Porada nospora bardzo się przydała.

Wykombinowałem to następująco:


  1. <?
  2.  
  3.  
  4. $jeden = mysql_query("SELECT * FROM newsy WHERE cat=18 ORDER BY pod", $con);
  5. if (!$jeden) {
  6. die('Jest problem: ' . mysql_error());
  7. }
  8. while ($row = mysql_fetch_array($jeden)) {
  9. $pod = $row['pod'];
  10. $podnr = $row['podnr'];
  11. $tytul = zmien_tekst($row['subject']);
  12. //jeśli nie było jeszcze danej kategorii, to ją tworzymy
  13. if (!isset($categories[$podnr]))
  14. $categories[$podnr] = array('name' => $tytul, 'products' => array());
  15. //dodajemy do kategorii kolejne produkty
  16. if (!empty($tytul)) //jeśli istnieje produkt
  17. if ($pod == 1) {
  18. $categories[$podnr]['products'][] = array('name' => $tytul, 'id'=>$row['id'], 'podmenu'=>$row['pod']);
  19. }
  20. }
  21. echo '<ul>';
  22. foreach ($categories as $idCat => $category){ //petla, która leci po kategoriach
  23. echo '<li><a href="#">'.$category['name'].'</a> <ul>';
  24. foreach ($category['products'] as $product){ //pętla, która leci po produktach w kategorii
  25. echo '<li><a href="#">'.$product['name'].'</a></li>';
  26. }
  27. echo '</ul></li>';
  28. }
  29. echo '</ul>';
  30.  
  31. ?>


Tak na prawdę trzeba było tylko zmienić zapytanie i dodać warunek aby w drugim poziomie nie pokazywał rekordów których wartość pola POD wynosi 0. Problem miałem z wyciągnieciem w tablicy menu w poziomie pierwszym. Oczywiście, za dużo grzebałem, bo okazało się, że wystarczyło pozostawić kod bez większych zmian i pozmieniać nazwy zmiennych. Także dziękuję bardzo. Oczywiście, jeśli coś by można było jeszcze poprawić pod względem optymalizacji jestem jak najbardziej otwarty na sugestie smile.gif

Jeśli chodzi o menu drzewko IP powiem że to bardzo ciekawe rozwiązanie, które będę chciał zastosować prędzej czy później. Na pewno ułatwi mi to zycie smile.gif

Pozdrawiam i dziękuję za pomoc.
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.