Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Wyświetlanie wyników zapytania SQL i pętla foreach
Forum PHP.pl > Forum > Przedszkole
session_destroy();
Witam.

Jestem nowy na forum tak więc chciałem się na początku przywitać  haha.gif

Mam nadzieję, że nie będziecie dla mnie za ostrzy jak na początek, ale przejdzmy już do rzeczy ...

Zrobiłem prostą funkcję, która ma na celu zwrócić wynik zapytania.

Służy ona głównie do tego, aby nie powtarzać ciągle tego samego kodu, więc szybciej się wtedy pisze.

CODE

function sql($query){
$q = mysql_query($query)or die(mysql_error());
return mysql_fetch_assoc($q)or die(mysql_error());
}


Chciałem zapytać czy da się jakoś wyświetlić wyniki w pętli foreach dla zapytania, które zwróci więcej niż jeden wynik?

Mi niestety zawsze zwraca jeden wynik, dlatego jeśli już mam wyświetlić więcej rekordów muszę pisać:

CODE


while($row = mysql_fetch_assoc($q)){

// dane

}


Jeżeli, ktoś wie jak ten problem rozwiązać to proszę o odpowiedź  smile.gif
UNK
Po prostu najpierw musisz wpakować to do zmiennej asocjacyjnej, a dopiero później wyrzucić z funkcji przez return.
  1. <?php
  2. function sql($query){
  3. $q = mysql_query($query)or die(mysql_error());
  4. while($row[] = mysql_fetch_assoc($q)){}
  5. return $row;
  6. }
  7. ?>


Wydaje mi się, że dlatego że jest to ładowane do zmiennej tablicowej dwuwymiarowej i jest ładowana tylko ostatnia albo pierwsza wartość tabeli, a reszta olewana/zastąpiona.
Takie coś powinno działać, ale nie wiem czy jest w pełni poprawne.
session_destroy();
Dzięki za szybką odpowiedź.

Po zastosowaniu twojej metody działa prawie poprawnie. Udaje mi się wyświetlać już
dane z tablicy asocjacyjnej, jednak jakimś dziwnym trafem rekordów jest zawsze o jeden wiecej.
Np. jak mam 11 rekordów w wyniku zapytania to wyświetla mi te 11 jeszcze jedno miejsce puste (tak jakby miało być 12 rekordów)

Czy da się to jakoś obejść ?
JoShiMa
Dzieje się tak bo pętla while najpierw sprawdza warunek a potem się wykonuje spróbuj tak:

  1. <?php
  2. while($row = mysql_fetch_assoc($q)){
  3. $rows[] = $row;
  4. }
  5. return $rows;
  6. ?>
Shili
Tudzież:
  1. <?php
  2. while($row[] = mysql_fetch_assoc($q));
  3. array_pop($row);
  4. return $row;
  5. ?>
UNK
no tak, bo tą metodą on najpierw przekazuje wartość do zmiennej a dopiero potem opuszcza pętle jeśli już nic nie ma do pobrania, stąd ten pusty wpis.

  1. <?php
  2. function sql($query){
  3. $q = mysql_query($query)or die(mysql_error());
  4. while($row = mysql_fetch_assoc($q)){ $row2[] = $row; }
  5. return $row2;
  6. }
  7. ?>

W tym wypadku najpierw zostanie sprawdzone czy wynik jest pusty a potem przekazany do zmiennej.
Na pewno da się to jeszcze inaczej zrobić, ale nie mam myślenia dzisiaj biggrin.gif

JoShiMa mnie trochę ubiegł/a
session_destroy();
Wielkie dzięki za Wasze odpowiedzi smile.gif.
Teraz wszystko działa tak jak powinno biggrin.gif i jestem bardzo zadowolony.
Nurtuje mnie jednak pytanie, która z przedstawionych metod jest bardziej wydajna.

metoda Shili z wykorzystaniem array_pop

czy też metoda: JoShiM'y i UNK'a z wykorzystaniem pętli while?

Jeżeli, wiecie proszę o jeszcze jedną odpowiedź smile.gif
JoShiMa
Shili też wykorzystuje while, też wykorzystuje przypisanie do tablicy w każdej pętli. Na dodatek wykonuje dwie operacje ekstra. Przypisanie pustego rekordu a potem skasowanie go. Hmmm. Nie wiem czy jest jakaś istotna różnica.

Cytat
Wielkie dzięki za Wasze odpowiedzi smile.gif.
Teraz wszystko działa tak jak powinno biggrin.gif i jestem bardzo zadowolony.

Możesz to wyrazić klikając odpowiedni przycisk hi hi hi aaevil.gif
Shili
Tylko jakby nie patrzeć wykonuję jedno przypisanie mniej w samej pętli w każdej iteracji.
Kwestia po prostu tego, że raczej nie tutaj trzeba szukać poprawy wydajności, jeśli już winksmiley.jpg To tak naprawdę są ułamki, które niewiele robią, bez względu na to, która metoda jest szybsza, a która wolniejsza. Zwłaszcza bądź co bądź przy bazie danych ^^
session_destroy();
Cytat(JoShiMa @ 18.09.2008, 09:50:41 ) *
Shili też wykorzystuje while, też wykorzystuje przypisanie do tablicy w każdej pętli. Na dodatek wykonuje dwie operacje ekstra. Przypisanie pustego rekordu a potem skasowanie go. Hmmm. Nie wiem czy jest jakaś istotna różnica.


Możesz to wyrazić klikając odpowiedni przycisk hi hi hi aaevil.gif


hehe właśnie się o tym dowiedziałem cool.gif , więc każdy dostał już to co mu się należało yahoo.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.