Drugi parametr funkcji rzeczywiście jest niepotrzebny. Natomiast nadpisywanie zmiennej $row nie ma tutaj nic do rzeczy, choć to zależy od tego, czy w drugiej pętli while (lub w ogóle po nadpisaniu zmiennej $row) wykorzystujesz (chcesz wykorzystać) dane pobrane za pomocą pierwszego zapytania. Niewątpliwie problemem jest nadpisywanie obiektu $s, gdyż obiekt ten przechowuje odpowiedni zasób zwrócony przez zapytanie SQL. Kiedy pierwsza pętla while wykona już jeden przebieg, to próbuje uzyskać dostęp do zmiennej $res obiektu $s, aby pobrać następny rekord. Jednak obiekt ten został nadpisany i nie zawiera już wyników pierwszego zapytania, a zawiera wyniki zapytania drugiego (
tutaj się gubi, ale nie druga pętla, tylko pierwsza). Wyjaśnię dobitniej w komentarzach do kodu:
// tworzymy obiekt $s
$s->sql("zapytanie"); // wykonujemy zapytanie, a identyfikator zasobu zapisujemy w zmiennej $res obiektu $s
while($row = my..fe..as($s->res)) { // pobieramy wiersz z zasobu przypisanego do zmiennej $res obiektu $s
// tutaj możemy wykorzystać dane pobrane z pierwszego zapytania i zapisane w zmiennej $row
$s->sql("zapytanie2"); // wykonujemy zapytanie, a identyfikator zasobu zapisujemy w zmiennej $res obiektu $s
// i tutaj pojawia się problem, ponieważ pierwsza pętla while nie będzie się poruszać po zasobie zwróconym
// przez pierwsze zapytanie, gdyż został on nadpisany, a będzie się poruszać po zasobie zwróconym przez drugie zapytanie
while($row = my..fe..as($s->res)) {
// tutaj już nie możemy wykorzystać danych pobrany z pierwszego zapytania, gdyż teraz w zmiennej $row znajdują się dane pobrane z drugiego zapytania
// wykorzystanie tutaj drugiej pętli while w praktyce oznacza, że pierwsza pętla while kończy działanie, już po pierwszym przebiegu, ponieważ ukryty wskaźnik wyniku został przesunięty do końca zasobu zwróconego przez drugie zapytanie, po którym to zasobie teraz porusza się również pierwsza pętla
}
// tutaj również nie możemy wykorzystać danych pobranych z pierwszego zapytania, ponieważ w zmiennej $row mamy w tej chwili dane z ostatniego wiersza zwróconego przez drugie zapytanie
}
Jeszcze słowo odnośnie rozwiązania z identyfikatorem wyniku. W praktyce nie stosuje się takiego czegoś. Zazwyczaj jeden obiekt przechowuje wyniki jednego zapytania, a inny obiekt wyniki innego zapytania. Jednak nie jest to niewykonalne. Kwestią do rozstrzygnięcia jest odpowiednia budowa klasy.
@mdco: piszesz o nadpisywaniu i sam nadpisujesz
class S {
public var $res;
public __construct() {
//......
}
public function sql($q) {
}
}
$s = new S();
$s->sql("zapytanie1");
while($row1 = my..fe..as($s->res)) {
$s = new S();
$s->sql("zapytanie2");
while($row2 = my..fe..as($s->res)) {
}
}