Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pętla w pętli (PHP + MySQL)
Forum PHP.pl > Forum > Przedszkole
grzesq
Witam.

W tabeli aktualnosci przechowuję newsy. Każdy wpis ma przypisany unikalny identyfikator. W drugiej tabeli znajdują się rekordy zdjęć. W każdym rekordzie oprócz pola z nazwą pliku znajduje się pole nr, które określa do jakiego newsa odnosi się dane zdjęcie.

Jeśli identyfikator danego wpisu zgadza się z zawartością pola nr w drugiej tabeli, obok wpisu ma pojawić się zdjęcie.

Zapisałem taki kod:
  1. <?php
  2. $wynik = mysql_db_query("baza","SELECT * FROM aktualnosci ORDER BY nr DESC");
  3. $wynik_pliki = mysql_db_query("baza","SELECT * FROM pliki");
  4.  
  5. while ($rekord = mysql_fetch_array ($wynik)) {
  6. $id = $rekord[0];
  7. $data = $rekord[1];
  8. $tytul = $rekord[2];
  9. $tresc = $rekord[3];
  10. $autor = $rekord[4];
  11.  
  12. while ($rekord_pliki = mysql_fetch_array ($wynik_pliki)) {
  13. $nr_tytulu = $rekord_pliki[1];
  14. $nazwa_pliku = $rekord_pliki[2];
  15. $opis = $rekord_pliki[3];
  16. if ($nr_tytulu == $id)
  17. print $nazwa_pliku . '<br>';
  18. }
  19.  
  20. print '<p class="title"><span style="font-size:x-small">'."$data".'</span><br />';
  21. print "$tytul".'</p>';
  22. print '<p>' . $tresc . '</p>';
  23. print '<p><b>' . $autor . '</b></p>';
  24. print '<hr>';
  25. }
  26. ?>


Nazwa pliku drukowana jest niestety, tylko dla pierwszego newsa o najwyższym identyfikatorze.
Jak mogę poprawić mój skrypt?
mrjozo
  1. <?php
  2. $wynik = mysql_db_query("baza","SELECT * FROM aktualnosci ORDER BY nr DESC");
  3. $wynik_pliki = mysql_db_query("baza","SELECT * FROM pliki");
  4.  
  5. $pliki = array();
  6.  
  7. while ($rekord_pliki = mysql_fetch_array ($wynik_pliki)) {
  8. pliki["$rekord_pliki[1]"]['nazwa_pliku'] = $rekord_pliki[2];
  9. pliki["$rekord_pliki[1]"]['opis'] = $rekord_pliki[3];
  10. }
  11.  
  12. while ($rekord = mysql_fetch_array ($wynik)) {
  13. $id = $rekord[0];
  14. $data = $rekord[1];
  15. $tytul = $rekord[2];
  16. $tresc = $rekord[3];
  17. $autor = $rekord[4];
  18.  
  19. print $pliki["$id"]['nazwa_pliku'] . '<br>';
  20. //print $pliki["$id"]['opis'] . '<br>';
  21.  
  22. print '<p class="title"><span style="font-size:x-small">'."$data".'</span><br />';
  23. print "$tytul".'</p>';
  24. print '<p>' . $tresc . '</p>';
  25. print '<p><b>' . $autor . '</b></p>';
  26. print '<hr>';
  27. }
  28. ?>

lub (musisz wpisac Twoje nazwy pól w bazie w poniższym kodzie)
  1. <?php
  2. $wynik = mysql_db_query("baza","SELECT a.id,a.data,a.tytul,a.tresc,a.autor,p.nr, p.nazwa_pliku,p.opis FROM 
    aktualnosci a LEFT OUTER JOIN pliki p USING p.nr=a.id GROUP BY a.id ORDER BY a.id
     DESC"
    );
  3.  
  4.  
  5. while ($rekord = mysql_fetch_array ($wynik)) {
  6. $id = $rekord[0];
  7. $data = $rekord[1];
  8. $tytul = $rekord[2];
  9. $tresc = $rekord[3];
  10. $autor = $rekord[4];
  11. $nr = $rekord[5];
  12. $nazwa_pliku = $rekord[6];
  13. $opis = $rekord[7];
  14.  
  15. print $nazwa_pliku. '<br>';
  16. //print $opis . '<br>';
  17.  
  18. print '<p class="title"><span style="font-size:x-small">'."$data".'</span><br />';
  19. print "$tytul".'</p>';
  20. print '<p>' . $tresc . '</p>';
  21. print '<p><b>' . $autor . '</b></p>';
  22. print '<hr>';
  23. }
  24. ?>
Hostis
Problem jest chyba tego typu ze podczas wywyołania tej pętli w środku mysql_fetch_array zapamietuje że już przejrzał tablice i w nastepnych wywołaniach pętli zewnętrznej pętla wewnętrzna nie jest wykonywana.


Spróbuj tak (nie jestem przekonany czy działa poprawnie proszę o korektę jak coś)
  1. <?php
  2.  
  3. $wynik = mysql_db_query("baza","SELECT * FROM aktualnosci ORDER BY nr DESC");
  4. $wynik_pliki = mysql_db_query("baza","SELECT * FROM pliki");
  5.  
  6. function getArray($data)
  7. {
  8. $arr = array();
  9.  
  10. while($row = mysql_fetch_array($data))
  11. {
  12. array_push($arr, $row);
  13. }
  14.  
  15. return $arr;
  16. }
  17.  
  18. $aNews = getArray($wynik);
  19. $aImage = getArray($wynik_plik);
  20.  
  21. foreach($aNews as $rekord) 
  22. {
  23. $id = $rekord[0];
  24. $data = $rekord[1];
  25. $tytul = $rekord[2];
  26. $tresc = $rekord[3];
  27. $autor = $rekord[4];
  28.  
  29. foreach($aImage as $rekord_plik)
  30. {
  31. $nr_tytulu = $rekord_pliki[1];
  32. $nazwa_pliku = $rekord_pliki[2];
  33. $opis = $rekord_pliki[3];
  34. if ($nr_tytulu == $id)
  35. print $nazwa_pliku . '<br>';
  36. }
  37.  
  38. print '<p class="title"><span style="font-size:x-small">'."$data".'</span><br />';
  39. print "$tytul".'</p>';
  40. print '<p>' . $tresc . '</p>';
  41. print '<p><b>' . $autor . '</b></p>';
  42. print '<hr>';
  43. }
  44.  
  45. ?>
grzesq
  1. <?php
  2. pliki["$rekord_pliki[1]"]['nazwa_pliku'] = $rekord_pliki[2];
  3. pliki["$rekord_pliki[1]"]['opis'] = $rekord_pliki[3];
  4. ?>

tutaj podopisywać dolarki na początkach raczej?

edit:
Zapomniałem dodać, że w tej drugiej tabeli może być więcej niż jedno zdjęcie do pojedynczego identyfikatora z tabeli pierwszej.

W przypadku tego drugiego rozwiązania otrzymuję błąd, a jak wklepie zapytanie w phpMyAdmin to mam:
Kod
MySQL zwrócił komunikat:
#1064 - Something is wrong in your syntax obok 'p.nr_tytulu=a.nr GROUP BY a.nr ORDER BY a.nr DESC LIMIT 0, 30' w linii 1


edit2:
Hostis - Twój skrypt spełnia zadanie! Jest tam kilka drobnych błędów w nazwach tablic (plik zamiast pliki) ale do drobiazg winksmiley.jpg Dziękuję obu panom za pomoc! smile.gif
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.