Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Wyświetlanie wyników zapytania SQL i pętla foreach
session_destroy(...
post 16.09.2008, 21:48:44
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.08.2008

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


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

Ten post edytował session_destroy(); 16.09.2008, 21:50:40
Go to the top of the page
+Quote Post
UNK
post 16.09.2008, 22:01:28
Post #2





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

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


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.
Go to the top of the page
+Quote Post
session_destroy(...
post 17.09.2008, 10:29:46
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.08.2008

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


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ść ?
Go to the top of the page
+Quote Post
JoShiMa
post 17.09.2008, 11:04:05
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
Shili
post 17.09.2008, 11:07:18
Post #5





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Tudzież:
  1. <?php
  2. while($row[] = mysql_fetch_assoc($q));
  3. array_pop($row);
  4. return $row;
  5. ?>
Go to the top of the page
+Quote Post
UNK
post 17.09.2008, 11:14:16
Post #6





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

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


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

Ten post edytował UNK 17.09.2008, 11:15:35
Go to the top of the page
+Quote Post
session_destroy(...
post 17.09.2008, 17:34:11
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.08.2008

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


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
Go to the top of the page
+Quote Post
JoShiMa
post 18.09.2008, 08:50:41
Post #8





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


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


--------------------
Go to the top of the page
+Quote Post
Shili
post 18.09.2008, 10:35:21
Post #9





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


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 ^^

Ten post edytował Shili 18.09.2008, 10:36:39
Go to the top of the page
+Quote Post
session_destroy(...
post 18.09.2008, 11:21:28
Post #10





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 31.08.2008

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


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 01:18