$zapytanie = mysqli_query($db, "SELECT imie, nazwisko FROM uzytkownik"); while ($wiersz = ……………………) echo "$wiersz[0] $wiersz[1]"; W prezentowanym...
$zapytanie = mysqli_query($db, "SELECT imie, nazwisko FROM uzytkownik"); while ($wiersz = ……………………) echo "$wiersz[0] $wiersz[1]";W prezentowanym kodzie PHP w miejscu kropek powinno znaleźć się polecenie
A. mysqli_num_fields($zapytanie)
B. mysqli_query($zapytanie)
C. mysqli_fetch_array($zapytanie)
D. mysqli_free_result($zapytanie)
Pytanie z egzaminu CKE, czerwiec 2022 (arkusz E.14-SG-22.06).
W tym miejscu pętli while trzeba pobierać kolejne rekordy ze zbioru wyników zapytania, dlatego poprawne jest mysqli_fetch_array($zapytanie). Funkcja mysqli_query($db, 'SELECT imie, nazwisko FROM uzytkownik') wysyła zapytanie SQL do serwera MySQL i zwraca wynik, czyli obiekt lub zasób z rekordami. Samo zapytanie nie daje jeszcze pojedynczego wiersza do wyświetlenia. Dopiero mysqli_fetch_array($zapytanie) odczytuje następny wiersz wyniku i zwraca go jako tablicę. W pokazanym kodzie użyto potem $wiersz[0] i $wiersz[1], czyli dostępu po indeksach liczbowych: 0 oznacza kolumnę imie, a 1 oznacza kolumnę nazwisko. Gdy funkcja nie ma już kolejnego rekordu, zwraca false, więc pętla while naturalnie się kończy. To jest bardzo typowy schemat pracy z bazą danych w PHP: wykonaj SELECT, pobieraj rekordy w pętli, wyświetl lub przetwórz dane. Moim zdaniem warto też pamiętać o dobrych praktykach: w prawdziwej aplikacji sprawdzamy, czy mysqli_query nie zwróciło false, obsługujemy błędy, ustawiamy kodowanie połączenia, a przy danych od użytkownika stosujemy prepared statements. Do samego odczytu listy użytkowników taka pętla jest jednak jak najbardziej klasyczna i praktyczna.
W tym fragmencie kodu trzeba odróżnić kilka etapów pracy z bazą danych, bo właśnie tutaj często robi się małe, ale dość uparte błędy. mysqli_query służy do wykonania zapytania SQL na połączeniu z bazą. W pokazanym przykładzie zostało już użyte wcześniej razem z $db i tekstem zapytania SELECT. Wywoływanie mysqli_query($zapytanie) w pętli nie ma sensu, bo ta funkcja oczekuje połączenia i treści zapytania, a nie gotowego wyniku. To byłoby pomieszanie etapu wysłania zapytania z etapem odczytu rekordów. Z kolei mysqli_free_result($zapytanie) służy do zwolnienia pamięci zajętej przez wynik, zwykle po zakończeniu pracy z danymi. Gdyby użyć tego w warunku while, to zamiast pobierać rekordy, niszczylibyśmy wynik, więc pętla nie miałaby z czego czytać. mysqli_num_fields($zapytanie) zwraca liczbę kolumn w wyniku, na przykład tutaj prawdopodobnie 2, bo wybierane są imie i nazwisko. Taka liczba nie jest rekordem i nie da się z niej sensownie pobrać $wiersz[0] oraz $wiersz[1] jako danych użytkownika. Typowy błąd myślowy polega na tym, że każda funkcja z mysqli wydaje się podobna, bo ma podobną nazwę i przyjmuje wynik zapytania. W praktyce jednak każda robi coś innego: query wykonuje SQL, fetch pobiera wiersz, num_fields opisuje strukturę wyniku, a free_result sprząta zasoby. W tym kodzie potrzebna jest funkcja pobierająca kolejne wiersze, czyli mysqli_fetch_array($zapytanie). Z mojego doświadczenia najlepiej zapamiętać to jako prosty przepływ: najpierw zapytanie, potem fetch w pętli, na końcu ewentualne zwolnienie wyniku.