Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klopotliwa petla
Forum PHP.pl > Forum > PHP
a600user
Witam,

Mam problem z tablicami. Oto kawalek kodu, ktory - jak mi sie wydawalo - jest prosty i powinien dzialac w sposob oczywisty, wyswietlajac klucze i ich wartosci:

  1. <?php
  2. $sql=@mysql_query("SELECT orders.number, orders.model, ilosc, mobo, cpu, memo, memo, gfx, gfx2, msx, msx2, lan, sata, usb, fw, hdd, hdd2, flop, dvd, dvd2, psu, cas, keyb, mouse, os, spk, mon FROM orders_details, orders WHERE orders_details.status=1 and orders.number=orders_details.order_id;");
  3.  if (!$sql) {
  4.   exit ('<P>Query Error : ' . mysql_error() . '</P>');
  5.  }
  6.  $ciag=mysql_fetch_array($sql);
  7.  $iter=1;
  8.  foreach ($ciag as $klucz => $wartosc) {
  9.    echo ('Iteracja: '.$iter.'<BR>Klucz: '.$klucz.'<BR>Wartosc: '.$wartosc.'<BR><BR>');
  10.    $iter++;
  11.  }
  12. ?>


A tu sie okazuje, ze lipa. Przykladowo: tablica ma 2 wiersze, kazdy po 26 elementow. Powinno byc wiec 26 iteracji (bo w kodzie dalem tylko przebieg dla pierwszego wiersza), tymczasem jest ich... 53 (?). Wyglada, jakby kazdy element przypisywany byl w petli foreach (ale nie chce sugerowac nic, jako ze sie g*** znam, okazuje sie) podwojnie, na dodatek gdzies jest jeden naddatek. Oto przykladowy printout wynikowy kodu:

Kod
Iteracja: 1
Klucz: 0
Wartosc: 200808180011

Iteracja: 2
Klucz: number
Wartosc: 200808180011


Ten drugi element jest prawidlowy. Z poczatku myslalem, ze to zapytanie sql mam zrabane, bo kiedys sie tak zdarzalo, ze przez niepoprawne logicznie zapytanie zwracany byl wynik ze zdublowanymi wynikami. Tym razem jest jednak ok, bo konsola wypluwa 2 wiersze - a z konsoli wklejam zapytanie bezposrednio do kodu.

Moglby mi ktos wytlumaczyc, co jest nie tak z ta petla ?
Dziekuje za wskazowki, rady, drogowskazy winksmiley.jpg
melkorm
mysql_fetch_array = zwraca tobie "dwie tablice" .... asocjacyjną i numeryczną ;]

czyli klucze masz odpowiednio:
- 0
- nazwa tabeli
-1
nazwa tabeli
... itp ;]

użyj mysql_fetch_assoc i będzie git winksmiley.jpg
qbs
  1. <?php
  2. $sql=@mysql_query("SELECT orders.number, orders.model, ilosc, mobo, cpu, memo, memo, gfx, gfx2, msx, msx2, lan, sata, usb, fw, hdd, hdd2, flop, dvd, dvd2, psu, cas, keyb, mouse, os, spk, mon FROM orders_details, orders WHERE orders_details.status=1 and orders.number=orders_details.order_id;");
  3. if (!is_resource($sql)) {
  4.  exit ('<P>Query Error : ' . mysql_error() . '</P>');
  5. }
  6. while( $ciag=mysql_fetch_array($sql,MYSQL_ASSOC) )
  7. {
  8.   $iter=1;
  9.   foreach ($ciag as $klucz => $wartosc) {
  10.     echo ('Iteracja: '.$iter.'<BR>Klucz: '.$klucz.'<BR>Wartosc: '.$wartosc.'<BR><BR>');
  11.     $iter++;
  12.     }
  13. }
  14. ?>


chyba o cos takiego ci chodzi?
nexis
Albo bezpośrednio użyj mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual.

  1. <?php
  2. $query = "SELECT * FROM `orders_details`, `orders` WHERE `orders_details`.`stat"
  3.        . "us` = 1 AND `orders`.`number` = `orders_details`.`order_id`";
  4. $query = mysql_query($query) or exit(mysql_error());
  5. echo '<ol>';
  6. while ($result = mysql_fetch_assoc($query)) {
  7.   foreach ($result as $key => $value) {
  8.      sprintf('<li>%s = %s</li>', $key, $value);
  9.   }
  10. }
  11. echo '</ol>';
  12. ?>
a600user
Dziala. Dziekuje - wiedzialem, ze bedziecie wiedzieli ;-)
qbs
nexis, to juz powiedzial malkorm winksmiley.jpg mysql_fetch_array jest jednak bardziej uzyteczne (choc sam preferuje mysql_fetch_object winksmiley.jpg ).
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.