$z = mysqli_query($db, "SELECT ulica, miasto, kod_pocztowy FROM adresy"); $a = mysqli_fetch_row($z); echo "$a[1], $a[2]"; W języku PHP zapisano...
$z = mysqli_query($db, "SELECT ulica, miasto, kod_pocztowy FROM adresy"); $a = mysqli_fetch_row($z); echo "$a[1], $a[2]";W języku PHP zapisano fragment kodu działającego na bazie MySQL. Jego zadaniem jest wypisanie
A. ulicy i miasta z pierwszego zwróconego rekordu.
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 ze wszystkich zwróconych rekordów.
Pytanie z egzaminu CKE, czerwiec 2017 (arkusz E.14-X-17.06).
Ten fragment kodu pobiera dane z bazy MySQL i wypisuje miasto oraz kod pocztowy z pierwszego zwróconego rekordu. Kluczowe są tu dwie rzeczy: kolejność kolumn w zapytaniu SQL oraz sposób działania funkcji mysqli_fetch_row. Zapytanie SELECT ulica, miasto, kod_pocztowy FROM adresy zwraca trzy kolumny dokładnie w takiej kolejności. Funkcja mysqli_fetch_row pobiera jeden wiersz wyniku i zwraca go jako tablicę indeksowaną numerycznie od zera. Czyli $a[0] to ulica, $a[1] to miasto, a $a[2] to kod_pocztowy. Instrukcja echo wypisuje więc wartości $a[1] i $a[2], czyli miasto oraz kod pocztowy. Ważne też, że nie ma tutaj pętli, np. while, więc kod obsługuje tylko pierwszy rekord z wyniku zapytania. W praktyce taki zapis spotyka się np. przy wyświetlaniu pierwszego adresu klienta albo pojedynczego wyniku wyszukiwania. Z mojego doświadczenia lepiej jednak w większych projektach używać czytelniejszych funkcji typu mysqli_fetch_assoc, bo wtedy odwołujemy się do nazw kolumn, np. miasto, a nie do indeksów, które łatwo pomylić po zmianie kolejności w SELECT.
W tym kodzie łatwo pomylić dwie sprawy: które kolumny są wypisywane oraz ile rekordów zostanie obsłużonych. Zapytanie SQL pobiera kolumny w kolejności: ulica, miasto, kod_pocztowy. Funkcja mysqli_fetch_row nie tworzy tablicy asocjacyjnej z nazwami pól, tylko zwykłą tablicę indeksowaną od 0. To oznacza, że indeks 0 odpowiada ulicy, indeks 1 odpowiada miastu, a indeks 2 odpowiada kodowi pocztowemu. Jeśli ktoś uzna, że $a[1] to ulica, popełnia typowy błąd wynikający z myślenia, że numerowanie zaczyna się od 1. W PHP, podobnie jak w wielu językach programowania, tablice numeryczne startują od zera, i to trzeba mieć z tyłu głowy. Druga pułapka dotyczy liczby rekordów. Samo mysqli_query może zwrócić wiele wierszy z tabeli adresy, ale mysqli_fetch_row wywołane jeden raz pobiera tylko jeden wiersz z zestawu wyników. Do przejścia przez wszystkie rekordy potrzebna byłaby pętla, najczęściej while ($a = mysqli_fetch_row($z)) albo wariant z mysqli_fetch_assoc. Dlatego interpretacje mówiące o wypisaniu danych ze wszystkich rekordów są niepoprawne. Kod nie ma żadnego mechanizmu iteracji, więc po prostu pobiera pierwszy dostępny rekord i kończy działanie wypisywania. Moim zdaniem to dobry przykład, że w pracy z bazą trzeba patrzeć jednocześnie na SQL i na strukturę danych zwróconą przez PHP, bo sama lista kolumn w SELECT jeszcze nie mówi, jak później odwołujemy się do wyniku.