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.
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.
$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>';
$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>';
Co robi trim()?
Poprawna: a) Trim czyści spacje, tabulatory i nowe linie.
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ą.
$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;
}
$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;
}
Co zwraca FILTER_VALIDATE_INT?
Poprawna: b) Niepoprawna liczba daje false, poprawna wartość int.
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.
$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>';
}
$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>';
}
Dlaczego wypełniamy pole ponownie?
Poprawna: d) Użytkownik poprawia tylko błędne pole.