Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla While
Forum PHP.pl > Forum > Przedszkole
kajzur
Witam, problem błahy, ale nie mogę się dopatrzeć błędu O.o Tworze jakimś cudem nieskończoną pętlę, oto takim kodem:

  1. <?php
  2. $d = $this->b->rowquery("select * from `pages` where `idusr` = '$id'");
  3. $this->b->blad();
  4. while($value = $d)
  5.        {
  6.  
  7. echo '<tr><td align="center" valign="top">
  8.    '.$value[0].'
  9.    </td>
  10.    <td align="center" valign="top">
  11.    '.$value[4].'
  12.    </td>
  13.    <td align="center" valign="top">
  14.    <a href="pages.php?act=usun&id='.$value[1].'">Usun strone</a>
  15.    </td></tr>';
  16.  
  17.        }
  18. ?>


I definicja metody rowquery:
  1. <?php
  2. public function rowquery( $sql )
  3.        {
  4.           $que=mysql_query($sql);
  5.           return @mysql_fetch_row($que);
  6.        }
  7. ?>
drake88
Kod
<?
$d = $this->b->rowquery("select * from `pages` where `idusr` = '$id'");
$this->b->blad();
while($value = $d)
       {

echo '<tr><td align="center" valign="top">
   '.$value[0].'
   </td>
   <td align="center" valign="top">
   '.$value[4].'
   </td>
   <td align="center" valign="top">
   <a href="pages.php?act=usun&id='.$value[1].'">Usun strone</a>
   </td></tr>';
   }
?>


Teraz winien jest kod być poprawnym, pętli nie rozpoczynamy od <?php lecz od <?, może to było przyczyną.
kajzur
Niestety nadal mamy nieskończoną pętlę.
mike
Błędy logiczne się kłaniają.
Zacznę od tego, że funkcja rowquery() jest pozbawiona jakiegokolwiek sensu. Po co Ci ona? Myślisz, że będzie bardziej pro jak zawalisz kod takimi pseudo OOP potworkami? tongue.gif
A teraz błędy:
1. while($value = $d) - wykonujesz przypisanie (=) a nie porównanie (==), stąd zawsze wartość tej operacji jest równa true;
kajzur
1. Nie funkcja a metoda.
2. To jest cała klasa.
3. Przy użyciu porównania dostaję pusty wynik, a przy przypisaniu dostałem właściwą wartość, tylko że nieskończenie wiele razy;p
mike
Cytat(kajzur @ 15.04.2009, 16:23:57 ) *
1. Nie funkcja a metoda.
W PHP to bez najmniejszego znaczenia.
Cytat(kajzur @ 15.04.2009, 16:23:57 ) *
2. To jest cała klasa.
Taaaa? Coś Ty?
Ta klasa jest prawdopodobnie tyle samo warta co ta funkcja. Powiedz mi co ona Ci daje poza tym, że przesłania natywną funkcję PHP nic przy tym nie wnosząc?
Cytat(kajzur @ 15.04.2009, 16:23:57 ) *
3. Przy użyciu porównania dostaję pusty wynik, a przy przypisaniu dostałem właściwą wartość, tylko że nieskończenie wiele razy;p
1. Racja.
2. Ale i tak kolejny błąd logiczny:
Przemyśl jaka jest różnica pomiędzy:
(niepoprawnie)
  1. <?php
  2.  
  3. $d = $this->b->rowquery("select * from `pages` where `idusr` = '$id'");
  4. while($value = $d) {
  5.    // ...
  6. }
  7.  
  8. ?>

(poprawnie)
  1. <?php
  2.  
  3. while($value = $this->b->rowquery("select * from `pages` where `idusr` = '$id'")) {
  4.    // ...
  5. }
  6.  
  7. ?>

Zamiast pisać takie potwory pseudo OOP zacznij korzystać z PHP Data Objects
kajzur
Ten "potworek" wudaje mi się bardziej poręczniejszy winksmiley.jpg Istnieje w sumie po to by szybko móc zmienić bazę danych, w zależności od platformy. Kod który pan określij jako poprawy nadal daje nieskończoną pętlę.
mike
Cytat(kajzur @ 15.04.2009, 16:38:50 ) *
Ten "potworek" wudaje mi się bardziej poręczniejszy winksmiley.jpg Istnieje w sumie po to by szybko móc zmienić bazę danych, w zależności od platformy.
Z jego poręcznością właśnie walczysz tongue.gif Więc czy ja wiem czy jest poręczny.
Pisanie "poręcznych" rzeczy, które robię to co język już ma jest pozbawione sensu. Zainteresuj się PDO.
Cytat(kajzur @ 15.04.2009, 16:38:50 ) *
Kod który pan określij jako poprawy nadal daje nieskończoną pętlę.
On nie miał działać, tylko miał dać Ci do myślenia.
Spójrz. Żeby ładnie iterować po wynikach zapytania w normalnej sytuacji wykonujesz coś w stylu while($row = mysql_fetch_row()) no ale ty masz to schowane do "poręcznej" funkcji, która wszystko psuje.
Żeby za każdym obrotem wydostać wiersz musisz iść w kierunku czegoś takiego while($value = $this->b->rowquery()) ale Twoje funkcja nie tylko zwraca wiersz ale wcześniej wykonuje zapytanie. I tu wszystko poszło na glebę tongue.gif
Przy takim kodzie:
  1. <?php
  2.  
  3. while($value = $this->b->rowquery("select * from `pages` where `idusr` = '$id'") {
  4. }
  5.  
  6. ?>

dzieje się tak:
1. Sprawdzenie warunku pętli;
2. Wykonanie funkcji rowquery();
3. Wykonanie zapytania select * from `pages` where `idusr` = '$id';
4. Zwrócenie wyników (a dokładnie pierwszego wiersza) przez mysql_fetch_row();
5. ...
6. Sprawdzenie warunku pętli;
7. Wykonanie funkcji rowquery();
8. Wykonanie zapytania select * from `pages` where `idusr` = '$id'; ! ! ! źle
9. Zwrócenie wyników (a dokładnie pierwszego wiersza) przez mysql_fetch_row();
10. ...
11. Sprawdzenie warunku pętli;
12. Wykonanie funkcji rowquery();
13. Wykonanie zapytania select * from `pages` where `idusr` = '$id'; ! ! ! źle
14. Zwrócenie wyników (a dokładnie pierwszego wiersza) przez mysql_fetch_row();
15. ...

Rozumiesz teraz co jest błędem? Funkcja rowquery() nie powinna wykonywać zapytania, bo za każdym razem jest to świeżo wykonane zapytanie stąd zawsze dostajesz pierwszy wiersz ze zbioru wyników.
kajzur
Faktycznie, przy używciu natywnych funkcji działa.. Ale nadal nie rozumiem jednej rzeczy, wiem co to pdo, i w sumie jakoś bez większej przyczyny nie używam go, ale np pdo ma coś takiego

http://pl.php.net/manual/pl/pdostatement.fetch.php

Czy tutaj będzie taki sam problem?
Hm, faktycznie bardzo poręczna.. Próbuję wyważyć otwarte drzwi..
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.