Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pętla w pętli (PHP + MySQL), pobieranie informacji z dwóch tabel, gdy dane pola mają tę samą wartoś
grzesq
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2007

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


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?

Ten post edytował grzesq 6.07.2007, 17:51:36
Go to the top of the page
+Quote Post
mrjozo
post
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 3
Dołączył: 27.06.2007

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


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





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 6.07.2007
Skąd: /home/skawina

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


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





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2007

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Dziękuję obu panom za pomoc! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował grzesq 6.07.2007, 22:19:58
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: 23.08.2025 - 10:32