W MySQLi wynik wykonania zapytania jest sygnalizowany wartością zwracaną przez funkcję. mysqli_query($polaczenie, $sql) zwraca obiekt/rezultat dla poprawnego zapytania typu SELECT, a FALSE, gdy zapytanie nie może zostać wykonane (np. błąd składni SQL, brak tabeli, brak uprawnień).
W pokazanym fragmencie sprawdzany jest warunek if (!$x). Znak ! to negacja logiczna, więc blok wykona się wtedy, gdy $x jest "fałszywe", czyli gdy mysqli_query zwróciło FALSE. Najlepszym komunikatem dla użytkownika jest zatem "Błąd przetwarzania zapytania." – jest ogólny i nie ujawnia szczegółów technicznych.
Dlaczego pozostałe propozycje nie pasują do kodu?
- "Zapytanie przetworzono pomyślnie." przeczy warunkowi negacji: ten tekst pasowałby do sytuacji, gdyby sprawdzano if ($x) albo obsługiwano gałąź else.
- "Nieprawidłowa nazwa bazy danych." nie wynika bezpośrednio z tego fragmentu. Błędy wyboru bazy lub połączenia dotyczą zwykle etapu łączenia/wyboru bazy, a tutaj testowany jest wynik wykonania konkretnego zapytania.
- "Nieprawidłowe hasło do bazy danych." również odnosi się do uwierzytelnienia przy połączeniu, a nie do wykonania zapytania. Samo FALSE z mysqli_query nie pozwala jednoznacznie stwierdzić, że przyczyną jest hasło.
W praktyce w aplikacjach produkcyjnych często stosuje się zasadę: użytkownik widzi komunikat ogólny, a szczegóły (np. z mysqli_error($polaczenie)) są logowane po stronie serwera. Dzięki temu nie ujawnia się informacji, które mogłyby ułatwić atak na bazę danych.