KWALIFIKACJA INF3 - PAŹDZIERNIK 2016

PYTANIE NR 37.
W przedstawionym kodzie PHP, zamiast znaków zapytania powinien pojawić się komunikat:
$x = mysqli_query($polaczenie, 'SELECT * FROM mieszkancy');
if (!$x) echo "??????????????????????";
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
mysqli_query() zwraca FALSE, gdy wykonanie zapytania SQL się nie powiedzie. Warunek if (!$x) oznacza więc "jeśli wynik jest fałszywy", czyli wystąpił błąd przetwarzania zapytania. Z tego powodu należy wyświetlić ogólny komunikat o błędzie, a nie informację o sukcesie.

Pełne wyjaśnienie:

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.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
FALSE oznacza, że zapytanie SQL nie zostało wykonane poprawnie (np. błąd składni, brak tabeli, brak uprawnień). Wtedy kod powinien obsłużyć błąd, np. wyświetlić ogólny komunikat użytkownikowi i zapisać szczegóły w logach. Dla poprawnego SELECT zwykle otrzymasz wynik/rezultat, nie FALSE.
Znak ! neguje wartość logiczną. if (!$x) znaczy: "jeżeli $x jest fałszywe", czyli w praktyce "jeżeli funkcja zwróciła FALSE". To typowy wzorzec do wykrywania błędu wykonania zapytania. Przy if ($x) sprawdzałbyś sytuację sukcesu.
Najczęściej są to: literówka w SQL, odwołanie do nieistniejącej tabeli/kolumny, brak uprawnień użytkownika bazy do SELECT, błędna składnia zapytania lub problem z kodowaniem znaków. W diagnostyce pomaga logowanie błędu po stronie serwera (np. z mysqli_error), ale użytkownikowi nie pokazuje się szczegółów.
Nie. Funkcje z rodziny mysql_* pochodzą ze starego rozszerzenia MySQL, które zostało najpierw oznaczone jako przestarzałe, a następnie usunięte z PHP 7+. W aktualnych projektach i na egzaminach powinno się używać MySQLi albo PDO, bo są wspierane i bezpieczniejsze.
PDO i MySQLi wspierają nowoczesne mechanizmy pracy z bazą, w tym prepared statements, co znacząco ogranicza ryzyko SQL injection. Dają też lepsze możliwości obsługi błędów (np. wyjątki w PDO) i są utrzymywane w nowych wersjach PHP. Stare mysql_* nie ma tych zalet i nie działa w PHP 7+.
Szczegóły błędu (np. nazwy tabel, fragment SQL, informacje o serwerze) mogą ujawniać wrażliwe dane o strukturze bazy i ułatwić atak. Dobrą praktyką jest wyświetlenie ogólnego komunikatu (np. "Błąd przetwarzania zapytania"), a szczegóły zapisać w logach serwera lub narzędziu monitoringu dostępnym dla administratora.
W środowisku testowym można pobrać szczegóły, np. przez mysqli_error($polaczenie) lub mysqli_errno($polaczenie). W produkcji takie dane lepiej logować, a nie wyświetlać. Na egzaminie najważniejsze jest rozpoznanie, że wynik FALSE oznacza błąd wykonania zapytania i wymaga obsługi.
Dla zapytań zwracających rekordy (np. SELECT) MySQLi zwraca rezultat, który można dalej przetwarzać (np. pobierać wiersze). Dla zapytań modyfikujących dane (np. INSERT/UPDATE/DELETE) często zwracane jest TRUE przy sukcesie albo FALSE przy błędzie. Mechanizm błędu pozostaje ten sam: FALSE oznacza niepowodzenie.
Często pomijają negację ! i wybierają komunikat o sukcesie, mimo że warunek wykrywa błąd. Inną pomyłką jest dopasowanie odpowiedzi o haśle lub bazie, choć ten fragment nie testuje logowania, tylko wynik wykonania zapytania. Pomaga zasada: FALSE z funkcji zapytania → błąd zapytania.
Ćwicz krótkie fragmenty: wykonanie zapytania, sprawdzanie wyniku, pobieranie danych oraz obsługę błędów. Zapamiętaj różnice między MySQLi i PDO oraz to, że funkcje mysql_* są nieaktualne. Warto też przećwiczyć wzorce bezpieczeństwa: prepared statements, walidacja danych i nieujawnianie szczegółów błędów.
info

Około 47% zdających odpowiada poprawnie na to pytanie. trudne

Specjaliści zwracają uwagę: "mysqli_query() zwraca FALSE, gdy wykonanie zapytania SQL się nie powiedzie."

Źródła:

  • PHP Manual: MySQL Functions (mysql_) - informacja o usunięciu rozszerzenia w PHP 7.0.0, https://www.php.net/manual/en/book.mysql.php - accessed 2026-03-01
  • PHP Manual: mysqli_query — Performs a query on the database (wartości zwracane i FALSE przy błędzie), https://www.php.net/manual/en/mysqli.query.php - accessed 2026-03-01
  • PHP: Migration Guide PHP 7.0.x - usunięcia i zmiany (m.in. usunięcie ext/mysql), https://www.php.net/manual/en/migration70.removed-exts-sapis.php - accessed 2026-03-01

Materiały:

  • Dokumentacja PHP: MySQLi (opis mysqli_query i zwracanych wartości)
  • Materiały o różnicach mysql vs MySQLi vs PDO oraz migracji do PHP 7+
  • Poradniki bezpieczeństwa aplikacji web: zasada nieujawniania szczegółów błędów użytkownikowi

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego