Walidacja danych z formularza (e-mail, telefon, NIP, PESEL)
- Formularze
- poziom: początkujący
- aktualizacja: 12 lipca 2026
Danych od użytkownika nigdy nie wolno przyjmować „na słowo". Ten zestaw funkcji sprawdza najczęściej zbierane dane — w tym polskie numery NIP i PESEL wraz z ich sumami kontrolnymi, więc wychwyci nie tylko literówki, ale i zmyślone numery.
Każda funkcja zwraca true/false, dzięki czemu łatwo wpleść je w dowolny formularz.
PHP
93 linii
Pobierz .php
<?php
/**
* Walidacja danych z formularza — skryptyPHP.com
* Zapisz jako: walidacja.php i dołączaj przez require 'walidacja.php';
*/
/** Adres e-mail. */
function waliduj_email(string $email): bool
{
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
/** Adres WWW (http lub https). */
function waliduj_url(string $url): bool
{
return filter_var($url, FILTER_VALIDATE_URL) !== false
&& preg_match('~^https?://~i', $url) === 1;
}
/** Polski numer telefonu: 9 cyfr, opcjonalnie +48, spacje i myślniki dozwolone. */
function waliduj_telefon(string $telefon): bool
{
$cyfry = preg_replace('~[\s\-\(\)]~', '', $telefon);
return preg_match('~^(\+?48)?\d{9}$~', $cyfry) === 1;
}
/** Polski kod pocztowy w formacie 00-000. */
function waliduj_kod_pocztowy(string $kod): bool
{
return preg_match('~^\d{2}-\d{3}$~', trim($kod)) === 1;
}
/** NIP — 10 cyfr + suma kontrolna. Akceptuje zapis z myślnikami. */
function waliduj_nip(string $nip): bool
{
$nip = preg_replace('~[\s\-]~', '', $nip);
if (!preg_match('~^\d{10}$~', $nip)) {
return false;
}
$wagi = [6, 5, 7, 2, 3, 4, 5, 6, 7];
$suma = 0;
foreach ($wagi as $i => $waga) {
$suma += $waga * (int) $nip[$i];
}
$kontrolna = $suma % 11;
return $kontrolna !== 10 && $kontrolna === (int) $nip[9];
}
/** PESEL — 11 cyfr + suma kontrolna. */
function waliduj_pesel(string $pesel): bool
{
if (!preg_match('~^\d{11}$~', $pesel)) {
return false;
}
$wagi = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
$suma = 0;
foreach ($wagi as $i => $waga) {
$suma += $waga * (int) $pesel[$i];
}
$kontrolna = (10 - ($suma % 10)) % 10;
return $kontrolna === (int) $pesel[10];
}
/** Długość tekstu w podanym przedziale (poprawnie liczy polskie znaki). */
function waliduj_dlugosc(string $tekst, int $min, int $max): bool
{
$dlugosc = mb_strlen(trim($tekst));
return $dlugosc >= $min && $dlugosc <= $max;
}
// ── PRZYKŁAD UŻYCIA ─────────────────────────────────────────
$bledy = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$telefon = trim($_POST['telefon'] ?? '');
$nip = trim($_POST['nip'] ?? '');
if (!waliduj_email($email)) {
$bledy['email'] = 'Podaj poprawny adres e-mail.';
}
if ($telefon !== '' && !waliduj_telefon($telefon)) {
$bledy['telefon'] = 'Podaj poprawny numer telefonu (9 cyfr).';
}
if ($nip !== '' && !waliduj_nip($nip)) {
$bledy['nip'] = 'Podany NIP jest nieprawidłowy.';
}
if (!$bledy) {
echo 'Wszystkie dane są poprawne!';
// ... tutaj zapis do bazy, wysyłka e-maila itd.
}
}
Jak użyć tego skryptu
- Zapisz funkcje w pliku
walidacja.phpi dołącz go w swoim skrypcie:require 'walidacja.php';. - Wywołuj funkcje na danych z
$_POSTlub$_GET— każda zwracatruealbofalse. - Komunikaty błędów zbieraj do tablicy (klucz = nazwa pola), a przy polach formularza wyświetlaj je z
htmlspecialchars().
Warto wiedzieć
- Walidacja to nie to samo co zabezpieczenie wyświetlania — przed wypisaniem danych w HTML zawsze używaj
htmlspecialchars(), a przed zapisem do bazy zapytań przygotowanych (PDO). - NIP i PESEL mają sumy kontrolne, więc te funkcje odrzucą numery zmyślone „z palca" — ale nie sprawdzą, czy numer faktycznie istnieje w rejestrach.
- Do długości tekstu używaj
mb_strlen(), a niestrlen()— polskie znaki w UTF-8 zajmują 2 bajty istrlen()liczy je podwójnie.
#walidacja
#formularz
#nip
#pesel
#filter_var
Podobne skrypty
Formularze
Formularz kontaktowy z wysyłką e-mail
Kompletny formularz kontaktowy w PHP: walidacja pól, ochrona przed spamem (honeypot), wysyłka wiadomości funkcją mail() i komunikat o powodzeniu.
początkujący Zobacz kod → FormularzeProsta CAPTCHA matematyczna (bez obrazków)
Lekka CAPTCHA oparta na prostym działaniu matematycznym i sesji PHP. Nie wymaga biblioteki GD, zewnętrznych usług ani plików cookie innych firm.
początkujący Zobacz kod →