Walidacja i ekstrakcja danych z numeru PESEL

PHP
Priorytet: Normalny Szkic

Zadanie 154: Walidacja i ekstrakcja danych z numeru PESEL

Wstęp

Powszechny Elektroniczny System Ewidencji Ludności (PESEL) to numer identyfikacyjny nadawany każdemu obywatelowi Polski. Składa się z 11 cyfr, które nie są przypadkowe – zakodowana jest w nich data urodzenia, płeć oraz liczba kontrolna.

Cel zadania

Napiszesz skrypt w PHP, który po podaniu numeru PESEL przez użytkownika:

  1. Sprawdzi poprawność numeru za pomocą algorytmu sumy kontrolnej.
  2. Wyodrębni i wyświetli kompletną datę urodzenia (uwzględniając wiek XX, XXI i inne).
  3. Określi płeć osoby (kobieta/mężczyzna).

1. Algorytm sumy kontrolnej

Aby sprawdzić, czy numer PESEL jest poprawny, mnożymy kolejnych 10 cyfr przez wagi: 1, 3, 7, 9, 1, 3, 7, 9, 1, 3.

Kroki:

  1. Pomnóż każdą z pierwszych 10 cyfr przez przypisaną wagę.
  2. Zsumuj wyniki (bierzemy tylko ostatnią cyfrę każdego iloczynu).
  3. Oblicz resztę z dzielenia sumy przez 10.
  4. Odejmij resztę od 10 (jeśli wyjdzie 10, cyfra kontrolna to 0).
  5. Wynik musi być równy ostatniej (11.) cyfrze numeru PESEL.

2. Wyciąganie daty urodzenia

Data urodzenia zapisana jest w pierwszych sześciu cyfrach: RRMMDD. Aby rozpoznać stulecie, musimy sprawdzić cyfry miesiąca (3 i 4 cyfra):

  • 01 - 12: Lata 1900 – 1999 (do miesiąca dodajemy 0)
  • 21 - 32: Lata 2000 – 2099 (od miesiąca odejmujemy 20)
  • 41 - 52: Lata 2100 – 2199 (od miesiąca odejmujemy 40)
  • 81 - 92: Lata 1800 – 1899 (od miesiąca odejmujemy 80)

3. Rozpoznawanie płci

Płeć zapisana jest w 10. cyfrze numeru PESEL:

  • Cyfra parzysta (0, 2, 4, 6, 8) -> Kobieta
  • Cyfra nieparzysta (1, 3, 5, 7, 9) -> Mężczyzna

Przykład kodu PHP

function infoPESEL($pesel) {
    if (strlen($pesel) != 11) return "Błędna długość";

    // 1. Walidacja sumy kontrolnej
    $weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
    $sum = 0;
    for ($i = 0; $i < 10; $i++) {
        $sum += $weights[$i] * $pesel[$i];
    }
    $check = (10 - ($sum % 10)) % 10;
    if ($check != $pesel[10]) return "PESEL niepoprawny (suma kontrolna)";

    // 2. Data urodzenia
    $year = substr($pesel, 0, 2);
    $month = substr($pesel, 2, 2);
    $day = substr($pesel, 4, 2);
    $century = 1900;

    if ($month > 80) { $century = 1800; $month -= 80; }
    elseif ($month > 60) { $century = 2200; $month -= 60; }
    elseif ($month > 40) { $century = 2100; $month -= 40; }
    elseif ($month > 20) { $century = 2000; $month -= 20; }

    $fullYear = $century + $year;

    // 3. Płeć
    $gender = ($pesel[9] % 2 == 0) ? "Kobieta" : "Mężczyzna";

    return "Urodzony: $day-$month-$fullYear, Płeć: $gender";
}

Zadania do samodzielnego wykonania

  1. Kompletna Walidacja: Dodaj do skryptu sprawdzanie, czy PESEL zawiera tylko cyfry (is_numeric).
  2. Zaawansowana Data: Zadbaj o to, aby w wyświetlanej dacie miesiące poniżej 10 miały zero z przodu (użyj str_pad lub prostego if).
  3. Weryfikacja Dnia: Sprawdź, czy dzień wyciągnięty z PESEL jest poprawnym dniem dla danego miesiąca (np. PESEL nie może mieć dnia 32). Użyj funkcji checkdate().
  4. Obliczanie Wieku: Na podstawie wyciągniętej daty urodzenia oblicz, ile lat ma aktualnie właściciel danego numeru PESEL.
  5. Dzień Tygodnia: Wyświetl informację, w jaki dzień tygodnia urodziła się ta osoba (np. Poniedziałek).
  6. Formularz HTML: Stwórz prosty formularz, gdzie użytkownik wpisuje PESEL, a pod spodem wyświetla się wynik działania Twojej funkcji.
  7. Obsługa 18-latków: Dodaj funkcję, która na podstawie PESEL sprawdza, czy osoba jest już pełnoletnia.
  8. Generacja PESEL: (Dla chętnych) Spróbuj napisać skrypt, który wygeneruje poprawny numer PESEL dla Twojej daty urodzenia.
  9. Logowanie błędów: Jeśli PESEL jest błędny, wyświetl konkretny powód (np. "Błędna cyfra kontrolna" lub "Nieprawidłowy miesiąc").
  10. Znak zodiaku: Na podstawie wyciągniętego dnia i miesiąca urodzenia, określ znak zodiaku danej osoby.

Git Help

git add .
git commit -m "PHP Zadanie 154: PESEL validation and data extraction"