W aplikacji PHP przesłano do bazy kwerendę SELECT za pomocą funkcji mysqli_query. Którą funkcję powinien zastosować użytkownik, aby sprawdzić, ile rekordów zwróciło zapytanie?
A. mysqli_fetch_row
B. mysqli_connect
C. mysqli_num_rows
D. mysqli_query
Pytanie z egzaminu CKE, czerwiec 2023 (arkusz EE.09-SG-23.06).
mysqli_num_rows to właściwa funkcja, bo jej zadaniem jest zwrócenie liczby wierszy znajdujących się w wyniku zapytania SELECT wykonanego przez mysqli_query. W typowym schemacie pracy najpierw łączysz się z bazą przez mysqli_connect, potem wykonujesz zapytanie funkcją mysqli_query, a otrzymany wynik, czyli obiekt mysqli_result, przekazujesz do mysqli_num_rows. Przykładowo: $wynik = mysqli_query($polaczenie, $sql); $ile = mysqli_num_rows($wynik);. Dzięki temu możesz sprawdzić, czy baza zwróciła jakieś rekordy, np. przed wyświetleniem tabeli z użytkownikami albo komunikatu typu brak wyników wyszukiwania. Moim zdaniem to jedna z tych funkcji, które warto znać na pamięć, bo pojawia się w prawie każdej prostej aplikacji PHP korzystającej z MySQL. Dobrą praktyką jest też wcześniejsze sprawdzenie, czy mysqli_query nie zwróciło false, bo wtedy zapytanie się nie wykonało i liczenie rekordów nie ma sensu. W kodzie produkcyjnym warto dodatkowo stosować prepared statements, szczególnie gdy dane pochodzą od użytkownika, oraz zwalniać wynik przez mysqli_free_result, jeśli operujemy na większych zbiorach danych.
W tym pytaniu chodzi o rozróżnienie funkcji, które wykonują różne etapy pracy z bazą danych. Samo mysqli_fetch_row nie służy do sprawdzania liczby rekordów. Ta funkcja pobiera pojedynczy wiersz z wyniku zapytania i zwraca go jako tablicę indeksowaną numerycznie. Przy okazji przesuwa wewnętrzny wskaźnik wyniku na następny rekord, więc używa się jej raczej w pętli, gdy chcemy odczytać dane, np. nazwę produktu, cenę albo login użytkownika. Typowy błąd polega na myleniu pobierania rekordu z liczeniem rekordów. Da się oczywiście zliczać wiersze ręcznie, pobierając je jeden po drugim, ale to jest mniej czytelne i zwykle niepotrzebne, gdy istnieje gotowa funkcja mysqli_num_rows. Funkcja mysqli_query również nie rozwiązuje problemu, bo ona wysyła zapytanie SQL do serwera bazy danych. Dla zapytania SELECT zwraca wynik, na którym dopiero potem można wykonać dalsze operacje, takie jak pobieranie wierszy albo sprawdzenie ich liczby. Z mojego doświadczenia uczniowie czasem wybierają ją, bo w treści pytania pojawia się zapytanie SELECT, ale to tylko etap wykonania kwerendy, nie analiza wyniku. mysqli_connect ma jeszcze inne zadanie: tworzy połączenie z serwerem MySQL. Bez połączenia nie wykonamy zapytania, ale samo połączenie nie mówi nic o liczbie rekordów. Poprawne myślenie jest takie: połącz się z bazą, wykonaj zapytanie, sprawdź wynik i dopiero potem go przetwarzaj. Właśnie do sprawdzenia liczby zwróconych wierszy służy mysqli_num_rows.