$z = mysqli_query($db, "SELECT ulica, miasto, kod_pocztowy FROM adresy"); $a = mysqli_fetch_row($z); echo "$a[0], $a[1]"; W języku PHP zapisano...
$z = mysqli_query($db, "SELECT ulica, miasto, kod_pocztowy FROM adresy"); $a = mysqli_fetch_row($z); echo "$a[0], $a[1]";W języku PHP zapisano fragment kodu działającego na bazie MySQL. Jego zadaniem jest wypisanie
A. ulicy i miasta ze wszystkich zwróconych rekordów.
B. miasta i kodu pocztowego z pierwszego zwróconego rekordu.
C. miasta i kodu pocztowego ze wszystkich zwróconych rekordów.
D. ulicy i miasta z pierwszego zwróconego rekordu.
Ten fragment kodu pobiera z bazy wynik zapytania SQL: SELECT ulica, miasto, kod_pocztowy FROM adresy. Funkcja mysqli_query wykonuje zapytanie i zwraca zestaw wyników, ale sama jeszcze niczego nie wypisuje. Dopiero mysqli_fetch_row($z) pobiera jeden wiersz z tego zestawu, konkretnie pierwszy dostępny rekord, i zapisuje go jako tablicę indeksowaną numerycznie. W tej tablicy $a[0] oznacza pierwszą kolumnę z SELECT, czyli ulica, $a[1] oznacza drugą kolumnę, czyli miasto, a $a[2] byłby kodem pocztowym. Instrukcja echo wypisuje tylko $a[0] i $a[1], więc na ekran trafi ulica i miasto z pierwszego zwróconego rekordu. Moim zdaniem warto zapamiętać tu dwie praktyczne rzeczy: kolejność kolumn w SELECT ma znaczenie przy mysqli_fetch_row, a do wypisania wielu rekordów potrzebna jest pętla, najczęściej while. W realnym projekcie dobrze też dodać ORDER BY, jeśli naprawdę zależy nam na „pierwszym” rekordzie, bo bez sortowania baza nie gwarantuje stabilnej kolejności wyników. Branżowo często używa się też mysqli_fetch_assoc, bo indeksy tekstowe typu $a['miasto'] są czytelniejsze i mniej podatne na pomyłki.
W tym kodzie łatwo pomylić dwie rzeczy: wykonanie zapytania z przetwarzaniem całego wyniku. mysqli_query pobiera z MySQL zestaw rekordów pasujących do zapytania, ale nie oznacza to jeszcze, że PHP automatycznie przejdzie przez wszystkie wiersze. Funkcja mysqli_fetch_row wywołana tylko raz pobiera tylko jeden rekord z wyniku, zwykle pierwszy dostępny. Jeśli w tabeli adresy jest dziesięć adresów, ten fragment nie wypisze dziesięciu linii, bo nie ma tu żadnej pętli while ani foreach. To jest typowy błąd myślowy: skoro SELECT może zwrócić wiele rekordów, to program też je wszystkie pokaże. Nie, trzeba je jawnie odczytać. Druga sprawa to indeksy tablicy zwróconej przez mysqli_fetch_row. Są one numeryczne i zaczynają się od zera, zgodnie z kolejnością kolumn w zapytaniu SQL. Skoro SELECT podaje kolejno ulica, miasto, kod_pocztowy, to $a[0] jest ulicą, $a[1] jest miastem, a $a[2] kodem pocztowym. Dlatego interpretacja, że wypisywane jest miasto i kod pocztowy, nie pasuje do użytych indeksów. Żeby wypisać miasto i kod pocztowy z pierwszego rekordu, kod musiałby użyć $a[1] oraz $a[2]. Żeby wypisać dane ze wszystkich rekordów, trzeba by zastosować pętlę, na przykład while ($a = mysqli_fetch_row($z)) { echo ... }. Z mojego doświadczenia takie zadania dobrze sprawdzają, czy rozumiesz nie tylko SQL, ale też sposób, w jaki PHP odbiera wyniki z bazy danych krok po kroku.