Jaka treść komunikatu powinna być wstawiona w przedstawionym kodzie PHP zamiast znaków zapytania?
mysqli_report(MYSQLI_REPORT_OFF); $a = mysqli_connect('localhost', 'adam', 'mojeHaslo'); if (!$a) echo "?????????????";
A. Błąd przetwarzania zapytania SQL
B. Wybrana baza nie istnieje.
C. Pomyślnie dodano rekord do bazy.
D. Błąd połączenia z serwerem SQL
Opracowane na podstawie zadania CKE, czerwiec 2016 (arkusz E.14-X-16.05): W arkuszu użyto funkcji mysql_connect, usuniętej w PHP 7. Zastąpiono ją mysqli_connect; mysqli_report(MYSQLI_REPORT_OFF) sprawia, że błąd połączenia zwraca false.
W tym fragmencie kodu sprawdzany jest wynik funkcji mysqli_connect, czyli samo połączenie z serwerem MySQL/MariaDB. Zmienna $a dostaje uchwyt połączenia, jeśli wszystko pójdzie dobrze, albo wartość false, jeżeli połączenia nie udało się zestawić. Warunek !$a oznacza więc: jeśli nie ma poprawnego połączenia, wyświetl komunikat o błędzie. Dlatego sensowna treść komunikatu to Błąd połączenia z serwerem SQL. Funkcja mysqli_report(MYSQLI_REPORT_OFF) wyłącza automatyczne raportowanie błędów w stylu wyjątków lub ostrzeżeń, więc programista sam musi sprawdzić wynik działania funkcji. W praktyce często dopisuje się jeszcze mysqli_connect_error(), żeby zobaczyć dokładny powód, np. zły login, złe hasło, wyłączony serwer albo niepoprawny host. Moim zdaniem to ważny nawyk: najpierw sprawdzamy połączenie, potem wybór bazy, a dopiero później wykonujemy zapytania SQL. Taki podział bardzo ułatwia diagnozowanie błędów w aplikacji webowej.
Warto tu rozdzielić kilka różnych etapów pracy z bazą danych, bo właśnie ich pomieszanie najczęściej prowadzi do złej odpowiedzi. Pokazany kod nie sprawdza, czy istnieje konkretna baza danych. W wywołaniu mysqli_connect podano tylko host, nazwę użytkownika i hasło, bez czwartego parametru z nazwą bazy. Problem z nieistniejącą bazą pojawiłby się dopiero przy próbie jej wskazania, na przykład przez czwarty argument funkcji mysqli_connect albo przez mysqli_select_db. Wtedy komunikat o braku wybranej bazy miałby sens, ale nie w tym miejscu programu. Kod nie wykonuje też żadnego zapytania SQL, więc nie można mówić o błędzie przetwarzania zapytania. Nie ma tu mysqli_query, instrukcji SELECT, INSERT, UPDATE ani DELETE. Z mojego doświadczenia uczniowie czasem widzą słowo SQL i od razu myślą o zapytaniu, ale tutaj chodzi o niższy poziom: zestawienie połączenia z serwerem. Tak samo komunikat o pomyślnym dodaniu rekordu jest zupełnie poza kontekstem. Dodawanie rekordu wymagałoby zapytania INSERT oraz sprawdzenia jego wyniku, a nie samego połączenia. Dobra praktyka jest taka: osobny komunikat dla błędu połączenia, osobny dla wyboru bazy, osobny dla błędu zapytania i dopiero osobny dla powodzenia operacji na danych. Dzięki temu aplikacja jest czytelniejsza i łatwiej ją debugować, szczególnie gdy działa już na prawdziwym serwerze, a nie tylko lokalnie.