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:
- Sprawdzi poprawność numeru za pomocą algorytmu sumy kontrolnej.
- Wyodrębni i wyświetli kompletną datę urodzenia (uwzględniając wiek XX, XXI i inne).
- 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:
- Pomnóż każdą z pierwszych 10 cyfr przez przypisaną wagę.
- Zsumuj wyniki (bierzemy tylko ostatnią cyfrę każdego iloczynu).
- Oblicz resztę z dzielenia sumy przez 10.
- Odejmij resztę od 10 (jeśli wyjdzie 10, cyfra kontrolna to 0).
- 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
- Kompletna Walidacja: Dodaj do skryptu sprawdzanie, czy PESEL zawiera tylko cyfry (
is_numeric). - Zaawansowana Data: Zadbaj o to, aby w wyświetlanej dacie miesiące poniżej 10 miały zero z przodu (użyj
str_padlub prostegoif). - 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(). - Obliczanie Wieku: Na podstawie wyciągniętej daty urodzenia oblicz, ile lat ma aktualnie właściciel danego numeru PESEL.
- Dzień Tygodnia: Wyświetl informację, w jaki dzień tygodnia urodziła się ta osoba (np. Poniedziałek).
- Formularz HTML: Stwórz prosty formularz, gdzie użytkownik wpisuje PESEL, a pod spodem wyświetla się wynik działania Twojej funkcji.
- Obsługa 18-latków: Dodaj funkcję, która na podstawie PESEL sprawdza, czy osoba jest już pełnoletnia.
- Generacja PESEL: (Dla chętnych) Spróbuj napisać skrypt, który wygeneruje poprawny numer PESEL dla Twojej daty urodzenia.
- 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").
- 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"