W budowie
Materiał edukacyjny · Informatyka

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>';
1. Co robi trim()?
2. Dlaczego empty(0) jest prawdą?
3. Gdzie zbieramy komunikaty?

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;
}
4. Co zwraca FILTER_VALIDATE_INT?
5. Jak sprawdzić zakres wieku?
6. Czy filtr wystarcza za walidację?

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>';
}
7. Dlaczego wypełniamy pole ponownie?
8. Co robi ctype_digit()?
9. Po co przekierowanie po sukcesie?

Ćwiczenia