Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [mysql] pętla while
Forum PHP.pl > Forum > Przedszkole
-Grzegorz-
Witam,

mam pytanie - jak działa pętla WHILE w sytuacji, kiedy pobieram dane z kilku tablic MYSQL (SELECT .... FROM .... AS ....)?

Kiedy wykonałem pętle WHILE przy wyborze jednej tablicy, wszystko wyświetliło się prawidłowo:

  1. <?php
  2. $pytanie = "SELECT nazwa, kursy FROM osrodki";
  3. $wykonaj = mysql_query($pytanie);
  4. while ($wynik = mysql_fetch_assoc($wykonaj))
  5. {
  6.  echo $wynik['nazwa'].":<br>";
  7.  $kurs = explode(";", $wynik['kursy']);
  8.  foreach ($kurs as $k)
  9.  {echo $k."<br>";}
  10. }
  11. ?>


Ale kiedy próbowałem tego samego z dwiema tablicami, wynik wyświetlił mi się kilka(dziesiąt? set?) razy - w kółko.

  1. <?php
  2. $pytanieD = "SELECT o.nazwa, o.kursy, k.nazwa_kursu, k.id_kursu FROM osrodki as o, kursy
     as k"
    ;
  3. $wykonajD = mysql_query($pytanieD);
  4. while ($wynikD = mysql_fetch_assoc($wykonajD))
  5. {
  6.  echo $wynikD['nazwa'].":<br>";
  7.  $kurs = explode(";", $wynikD['kursy']);
  8.  foreach ($kurs as $k)
  9.  {echo $k."<br>";}
  10. }
  11. ?>


Gdzie popełniłem błąd?
wipo
Błąd masz w zapytaniu. Pętla działa prawidłowo.
W zapytaniu nie dałeś warunku łączenia tabel przez co dostaniesz x*y wyników bo każdy rekord tablicy x został połączony z każdym rekorem z bazy y
-Grzegorz-
Dziękuję bardzo - pomogło smile.gif. Teraz pętla wykonuje się prawidłowo.

Chciałbym teraz przejść do następnego kroku, tzn. połączyć otrzymane rezultaty $k z odpowiednią 'nazwą_kursu' dobieraną wg klucza 'id_kursu". Inaczej mówiąc - chciałbym, żeby skrypt skojarzył otrzymane wyniki $k (pięciocyfrowe liczby) z odpowiednimi 'id_kursu' i przyporządkował im adekwatną 'nazwę_kursu'. Myślałem, że wystarczy tutaj warunek if:

  1. <?php
  2. $pytanie = "SELECT o.nazwa, o.kursy, k.nazwa_kursu, k.id_kursu FROM osrodki as o, kursy
     as k WHERE o.kursy=k.id_kursu"
    ;
  3. $wykonaj = mysql_query($pytanie);
  4. while ($wynik = mysql_fetch_assoc($wykonaj))
  5. {
  6.  echo $wynik['nazwa'].":<br>";
  7.  $kurs = explode(";", $wynik['kursy']);
  8.  foreach ($kurs as $k)
  9.  {
  10.  if ($k = $wynik['id_kursu'])
  11. {echo $k." - ".$wynik['nazwa_kursu']."<br>";}
  12.  }
  13. }
  14. ?>


...Ale to nie zadziałało. Nie zadziałało też "==", ani użycie pętli for. Gdzie się mylę?
Hazel
  1. <?php
  2. if ($k == $wynik['id_kursu'])
  3. {
  4.  echo $k." - ".$wynik['nazwa_kursu']."<br>";
  5. }
  6. ?>


Jesteś pewien, że taki kod nie działa?
P.S. Wcinaj kod prawidłowo, a dobrze na tym wyjdziesz.
-Grzegorz-
Cytat(Hazel @ 2.09.2007, 14:44:09 ) *
  1. <?php
  2. if ($k == $wynik['id_kursu'])
  3. {
  4.  echo $k." - ".$wynik['nazwa_kursu']."<br>";
  5. }
  6. ?>


Jesteś pewien, że taki kod nie działa?
P.S. Wcinaj kod prawidłowo, a dobrze na tym wyjdziesz.


Nie... nie działa. Dla każdego ośrodka ('nazwa') wyświetla tylko jeden (pierwszy) wynik 'nazwa_kursu'. A tych wyników powinna być cała lista (osobna lista dla każdego z ośrodków).
Hazel
Prześlij mi wywołanie funkcji var_dump($wykonaj);
Bo inaczej nie umiem Ci pomóc, nie znam struktury Twojej bazy danych i tego, co zwraca mysql_fetch_assoc()... A ten kod jest trochę niejasno napisany i nie umiem dojść, do czego on ma służyć...
-Grzegorz-
Cytat(Hazel @ 3.09.2007, 10:12:00 ) *
Prześlij mi wywołanie funkcji var_dump($wykonaj);
Bo inaczej nie umiem Ci pomóc, nie znam struktury Twojej bazy danych i tego, co zwraca mysql_fetch_assoc()... A ten kod jest trochę niejasno napisany i nie umiem dojść, do czego on ma służyć...


Hazel - może zadam bardziej ogólne pytanie: w jaki sposób mogę skojarzyć elementy zapisane w ciągu 'tagów' (w moim wypadku jest to 'kursy' - np. "31965;89545;94356;") z tabeli 1 (tabela 'osrodki') z konkretnymi rekordami z tabeli 2 (w moim wypadku chodzi o 'nazwa_kursu' z tabeli 'kursy', gdzie 'id_kursu' powinien być identyczny z wynikami ciągu; np. "31965 - Audytor wewnętrzny", "89545 - Programista Java", "94356 - Makler giełdowy").

Czyli - usuwając nawiasy smile.gif - w jaki sposób mogę skojarzyć elementy zapisane w ciągu 'tagów' z tabeli 1 z konkretnymi rekordami z tabeli 2?
Hazel
Nie bardzo wiem, co masz na myśli, mówiąc "skojarzyć". Porównać? Przypisać jedno do drugiego?
-Grzegorz-
Cytat(Hazel @ 3.09.2007, 18:53:39 ) *
Nie bardzo wiem, co masz na myśli, mówiąc "skojarzyć". Porównać? Przypisać jedno do drugiego?


Tak, przypisać. Tak jak w przykładzie z mojego poprzedniego posta.
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.