Przejdź do treści

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

  1. Zapisz funkcje w pliku walidacja.php i dołącz go w swoim skrypcie: require 'walidacja.php';.
  2. Wywołuj funkcje na danych z $_POST lub $_GET — każda zwraca true albo false.
  3. 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 nie strlen() — polskie znaki w UTF-8 zajmują 2 bajty i strlen() liczy je podwójnie.
#walidacja #formularz #nip #pesel #filter_var

Podobne skrypty