CZĘŚĆ 06
Walidacja danych z formularza
PPrezentacja dla nauczyciela
Egzamin zawodowy INF.03 ma dwie części: pisemną i praktyczną. Walidacja danych jest punktowana w obu — w części pisemnej jako pytanie o poprawny warunek, a w praktycznej jako działający kod. Błąd w walidacji to jedna z najczęstszych przyczyn utraty punktów.
Sprawdzanie obecności i pustki
Walidacja zaczyna się od pytania, czy dane w ogóle przyszły. isset() sprawdza istnienie, a empty() dodatkowo pustkę — ale pusty napis, zero i '0' też są dla niej puste.
Dlatego przy polach, w których zero jest poprawną wartością, lepiej porównać wprost: trim($wartosc) === ''. Funkcja trim() usuwa spacje z brzegów, żeby pole z samymi spacjami nie przeszło walidacji.
Wynik walidacji zbieramy w tablicy błędów. Jeśli jest pusta, dane są poprawne; jeśli nie — pokazujemy komunikaty przy polach.
$imie = trim($_GET['imie'] ?? '');
$wiek = $_GET['wiek'] ?? '';
$bledy = [];
if ($imie === '') {
$bledy[] = 'Podaj imie.';
}
if ($wiek === '') {
$bledy[] = 'Podaj wiek.';
}
echo $bledy ? '<p>Bledy: ' . count($bledy) . '</p>' : '<p>Dane poprawne</p>';
Typy, zakresy i filtry
Po sprawdzeniu obecności liczymy typ i zakres. Do liczb służy filter_var($v, FILTER_VALIDATE_INT), które zwraca liczbę albo false, gdy tekst nie jest liczbą.
Zakres sprawdzamy zwykłym warunkiem: $wiek >= 7 && $wiek <= 100. Dla adresów e-mail jest FILTER_VALIDATE_EMAIL, a dla adresów stron FILTER_VALIDATE_URL.
Filtry nie zastępują sensownego zakresu — poprawna liczba może nadal być absurdalna. Walidacja to zawsze dwa kroki: format i sens wartości.
$wiek = filter_var($_GET['wiek'] ?? '', FILTER_VALIDATE_INT);
if ($wiek === false) {
echo 'Wiek musi byc liczba';
} elseif ($wiek < 7 || $wiek > 100) {
echo 'Wiek poza zakresem';
} else {
echo 'Wiek poprawny: ' . $wiek;
}
Komunikaty i ponowne wypełnienie
Dobra walidacja nie kasuje danych użytkownika. Po błędzie pole znów pokazuje wpisaną wartość, żeby nie trzeba było wypełniać całego formularza od nowa.
Wartość wstawiamy do atrybutu value po zabezpieczeniu przez htmlspecialchars(). Komunikaty pokazujemy przy konkretnym polu, a nie jako jeden ogólny tekst na górze.
Komunikat powinien mówić, co poprawić — „Wiek musi być liczbą” jest lepszy niż „Błąd”. Po udanej walidacji dane zapisujemy i przekierowujemy, żeby odświeżenie strony nie wysłało formularza ponownie.
$imie = htmlspecialchars(trim($_GET['imie'] ?? ''), ENT_QUOTES, 'UTF-8');
$wiek = trim($_GET['wiek'] ?? '');
$bledy = [];
if ($imie === '') {
$bledy['imie'] = 'Podaj imie.';
}
if ($wiek === '' || !ctype_digit($wiek)) {
$bledy['wiek'] = 'Wiek musi byc liczba.';
}
echo '<form method="get">';
echo '<input name="imie" value="' . $imie . '">';
echo '<input name="wiek" value="' . htmlspecialchars($wiek) . '">';
echo '</form>';
foreach ($bledy as $komunikat) {
echo '<p>' . $komunikat . '</p>';
}
Ćwiczenia
- 1Pierwszy formularz metodą POSTpierwszy formularz POSTZadanie i podpowiedzi →
- 2Wymagana nazwa użytkownikatrim i puste poleZadanie i podpowiedzi →
- 3Sprawdzenie wymaganego nazwiskawymagane nazwisko po trimZadanie i podpowiedzi →
- 4Limit długości komentarzazakres długości tekstuZadanie i podpowiedzi →
- 5Zgodność powtórzonego hasłazgodność powtórzonego hasłaZadanie i podpowiedzi →
- 6Minimalna długość hasłaminimalna długość hasłaZadanie i podpowiedzi →
- 7Liczba całkowita większa od zerafilter_var i próg dodatniZadanie i podpowiedzi →
- 8Walidacja liczby z zakresemzakres liczby od 1 do 10Zadanie i podpowiedzi →
- 9Walidacja adresu e-mailwalidacja adresu e-mailZadanie i podpowiedzi →
- 10Sprawdzenie poprawności adresu URLfiltr adresu URLZadanie i podpowiedzi →
- 11Sprawdzenie metody żądania (POST vs GET)POST czy GET wg REQUEST_METHODZadanie i podpowiedzi →
- 12E-mail zostaje w polu po błędziepoprawne dane zostają w poluZadanie i podpowiedzi →
- 13Niezależne komunikaty błędów dla pólosobne błędy dla dwóch pólZadanie i podpowiedzi →
- 14Zbieranie błędów w listę punktowanąbłędy zbierane w listęZadanie i podpowiedzi →
- 15Formularz logowania ze sprawdzeniem hasłalogowanie: login i hasłoZadanie i podpowiedzi →
- 16Kompletna walidacja rejestracji (flaga stanu)walidacja rejestracji flagąZadanie i podpowiedzi →