Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Funkcja foreach - podwójne wykonywanie się pętli
Forum PHP.pl > Forum > Przedszkole
tolomei
Witam.
Mam dziwny problem z funkcją foreach.

Kod, o którym mowa:

  1. $wynik = @mysql_query('SELECT * FROM baza');
  2.  
  3. echo '<table border="1">';
  4. while ($wiersz = mysql_fetch_array($wynik)) {
  5. echo "<tr>\n";
  6. foreach($wiersz as $wartosc) {
  7. echo "<td>$wartosc</td>\n";
  8. }
  9. echo "</tr>\n";
  10. }
  11. echo '</table><br /><br />';


Kod html, który za pomocą powyższego otrzymuję wygląda tak:

  1. <table border="1"><tr>
  2. <td>1</td>
  3. <td>1</td>
  4. <td>Artykul pierwszy</td>
  5. <td>Artykul pierwszy</td>
  6. <td>2010-11-17</td>
  7. <td>2010-11-17</td>
  8. </tr>
  9. <tr>
  10. <td>2</td>
  11. <td>2</td>
  12. <td>Artykul drugi</td>
  13. <td>Artykul drugi</td>
  14. <td>2010-11-17</td>
  15. <td>2010-11-17</td>
  16. </tr>
  17. </table><br /><br />


Dodam, że tabela w bazie danych ma tyko trzy indeksy(id,artykul,dataartykulu).

Jak widać funkcja foreach wykonuje się dwukrotnie...

Nie wiem co z tym zrobić...


Bardzo dziękuję za pomoc.
Pozdrawiam
tolomei


Jeszcze chwilę pomyślałem, poczytałem i znalazłem mój błąd.
Niedopatrzenie było przy użyciu finckji mysql_fetch_array.
Wycinek z PHP Manual:


Cytat
array mysql_fetch_array ( resource $wynik [, int $ typ_wyniku ] )

Opcjonalny drugi argument result_type w funkcji mysql_fetch_array() jest stałą i może przyjmować następujące wartości: MYSQL_ASSOC, MYSQL_NUM i MYSQL_BOTH. Tę funkcjonalność dodano w PHP 3.0.7. Wartością domyślną jest MYSQL_BOTH.

Używając MYSQL_BOTH otrzymasz tablicę indeksowaną zarówno asocjacyjnie jak i numerycznie. MYSQL_ASSOC dostarczy tablicy indeksowanej tylko asocjacyjnie (jak w mysql_fetch_assoc()), natomiast MYSQL_NUM indeksowanej tylko numerycznie (jak w mysql_fetch_row()).


To oznacza, że gdy nie użyjemy drugiego argumentu funkcji to tablica zwracana przez funkcję będzie miała dwie komórki.

Trochę głupio, że sam sobie odpowiadam, więc już się tłumaczę.
Post z problemem napisałem po 1,5 godziny ciężkiego dociekania. Gdy tylko go opublikowałem - kontynuowałem szukanie i znalazłem smile.gif.
Usunąć postu nie mogłem, więc oto moja odpowiedź. Może komuś się przyda, gdy będzie miał podobny problem.

Pozdrawiam, dzięuję i przepraszam ! smile.gif
tolomei
flashdev
Cytat
mysql_fetch_array — Fetch a result row as an associative array, a numeric array, or both


Domyślnie jest BOTH, więc Twój skrypt działą prawidłowo, nieprawdaż?
tolomei
tak jest dokładnie smile.gif
elldiablo
  1. while ($wiersz = mysql_fetch_array($wynik)) {
  2. echo "<tr>\n";


może zrób tak:

  1. echo "<table border="1"><tr>\n";
  2. while ($wiersz = mysql_fetch_array($wynik)) {
tolomei
W ten sposób nie będzie poprawnie.

Jak widzisz - jedna iteracja pętli while to jeden kompletny wiersz(z bazy, jak i w tabeli).
Wiersz tabeli musi być otwarty na początku pętli, a później zamknięty pod koniec.

Jak poprzednio mówiłem, z problemem poradziłem sobie dodając w funkcji mysql_fetch_array() drugi argument - tak jak poniżej:

  1. while ($wiersz = mysql_fetch_array($wynik,MYSQL_ASSOC)) {


Dzięki za zainteresowanie.
Pozdrawiam
tolomei
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.