W budowie
Prezentacja modułu

Część 06 · Walidacja danych z formularza — kurs PHP INF.03

Część 06 kursu PHP pod kątem INF.03: Walidacja danych z formularza. Teoria w skrócie i 16 ćwiczeń z automatycznym sprawdzaniem — metoda POST, trim, filtry filter_var, komunikaty błędów i flaga stanu.

  • 45 min
  • 16 slajdów
  • Notatki nauczyciela: N
  • Strona modułu: otwórz
Plan · 45 min

Co dziś robimy

  1. 12 minSprawdzanie obecności i pustki Dlatego przy polach, w których zero jest poprawną wartością, lepiej porównać wprost…
  2. 12 minTypy, zakresy i filtry Zakres sprawdzamy zwykłym warunkiem: $wiek >= 7 && $wiek <= 100 .
  3. 12 minKomunikaty i ponowne wypełnienie Wartość wstawiamy do atrybutu value po zabezpieczeniu przez htmlspecialchars() .
  4. 4 minĆwiczenia 16 zadań w module — wybierz 3–4 na lekcję
  5. 5 minPodsumowanie bilet wyjściowy i zadanie domowe
Atom 1 z 4 · ~12 min

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.
Kod · atom 1 · ~3 min

Jak to wygląda w kodzie

$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>';
Przykład na żywo · atom 1 · ~3 min

Uruchom i pokaż

$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>';
Sprawdzenie · atom 1 · ~2 min

Pytanie do klasy

Co robi trim()?

Atom 2 z 4 · ~12 min

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.
Kod · atom 2 · ~3 min

Jak to wygląda w kodzie

$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;
}
Przykład na żywo · atom 2 · ~3 min

Uruchom i pokaż

$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;
}
Sprawdzenie · atom 2 · ~2 min

Pytanie do klasy

Co zwraca FILTER_VALIDATE_INT?

Atom 3 z 4 · ~12 min

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.
Kod · atom 3 · ~3 min

Jak to wygląda w kodzie

$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>';
}
Przykład na żywo · atom 3 · ~3 min

Uruchom i pokaż

$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>';
}
Sprawdzenie · atom 3 · ~2 min

Pytanie do klasy

Dlaczego wypełniamy pole ponownie?

Zamknięcie · ~3 min

Co zabrać z lekcji

  • Dlatego przy polach, w których zero jest poprawną wartością, lepiej porównać wprost: trim($wartosc) === '' .
  • Filtry nie zastępują sensownego zakresu — poprawna liczba może nadal być absurdalna.
  • Wartość wstawiamy do atrybutu value po zabezpieczeniu przez htmlspecialchars() .
  • Ćwiczenia
Bilet wyjściowy: Po co przekierowanie po sukcesie?
Odpowiedź: c) By nie wysłać ponownie
Hyżyk· Część 06 · Walidacja danych z formularza — kurs PHP INF.03 moduł 1 / 1