Nowy rok, nowy kod - walidacja PESEL

Szczęśliwego Nowego Roku!

Ładnie jest zacząć nowy rok jakimś merytorycznym wpisem. Zazwyczaj w tym okresie na wszelkiej maści blogach panuje przysłowiowe pitu pitu, a Ja się wyłamię i na początek roku dam troszkę kodu.

W tygodniu poświątecznym, rejestrując się na jakiejś stronie byłem zobowiązany podać numer PESEL. Jak zawsze, podałem bliżej nieokreślony ciąg cyfr... ale tym razem napis Nieprawidłowy numer PESEL nie chciał zniknąć. Walidacja okazała się na tyle skuteczna, że w końcu znużony, podałem prawdziwy numerek. Przy okazji pomyślałem, że przydałoby się widzieć, jak to działa. Wikipedia, Google i mam - dwie różne implementacje - metodą podręcznikową i skróconą.
Sama funkcja jest mało skomplikowana, więc nie zasługuje na notkę. Po ujęciu w klasę i dodaniu kilku funkcjonalności otrzymujemy gotowy komponent dla dowolnego walidatora.
Klasa potrafi:

  • Walidować poprawność numeru PESEL
  • Wyłuskać datę w formacie YYYYMMDD (to nie takie proste jak się wydaje)
  • Porównać datę znalezioną w PESELu z inną - podaną w formacie YYYYMMDD
  • Sprawdzić płeć osoby, do której należy numer

Jest to znów kod biblioteczny, więc jest nieco bardziej rozbudowany, niż wymaga tego samo sprawdzenie numeru PESEL. Zrezygnowałem z wyjątków, bo (moim zdaniem) nie przydadzą się przy walidacji - lepiej, żeby główny walidator obsłużył błędy sam.

Klasę i kilka przykładów znajdziesz w tym katalogu.
Na koniec nieśmiertelna formułka - jeśli znajdziesz błąd, uważasz, że coś można zrobić inaczej lub lepiej, to prosze o kontakt ideaheveme na gmail kropka com, lub pozostawienie komentarza :)

Komentarze

Info:

Nick:
Treść:

scanner napisał(a)
A nie byłoby wygodniej i krócej zapisać:
public function isFemale(){
return !$this->isMale();
}

Po co dwa takie same kawałki kodu?
scanner napisał(a)
A swoją droga, niejednokrotnie przydałaby sie tez metoda, sprawdzająca, czy dla podanej daty (defaultowo NOW() ) podany pesel należy do osoby pełnoletniej :)
cysiaczek napisał(a)
Rzeczywiście, masz rację - tak będzie lepiej :) Dzięki
mavestinus napisał(a)
Idąc za ciosem i skracając jak idzie, mógłbyś sztywno już przy deklarowaniu zmiennej $correct przypisać jej wartość 'false' i dalej – skoro zawsze będzie już bool'em to metodę isValid zapisać jako "return $this->correct;", unikając zbędnego warunku.
Mariusz Dalewski napisał(a)
Witam

Pełny algorytm weryfikacji numeru PESEL jest trochę bardziej skompilowany. Zapomniałeś wprowadzić np takie testy:
- test ilości dni w miesiącu urodzenia
- wykluczenie nr PESEL 00000000000, który jest poprawny wg skróconych algorytmów
- jeżeli ktoś urodził sie w 18XX to numer miesiąca oznaczany jest cyframi od 81 do 92, jeżeli ktoś urodził się w 20XX to numer miesiąca oznaczany jest cyframi od 21 do 32 a wiec trzeba wziąć pod uwagę inne oznaczenia miesięcy
- itp.

Mariusz Dalewski
http://aiv-dev.info
cysiaczek napisał(a)
@Mariusz - co do testu dni w miesiącu, to poniekąd zgoda, bo przyda się jeden dodatkowy test - na zakres drugiej cyfry miesiąca, gdy pierwsza jest równa 0. Zgodzę się również co do wyjątków takich jak 00000000000, który nawet w metodzie zawierającej wszystkie kroki (10) będzie poprawny. Jednak Co do stuleci, to wytykasz mi to niesłusznie, bo klasa poprawnie wykrywa rok w formacie YYYY. Jak znajdę trochę więcej czasu, to poprawię kod i napiszę coś więcej. Pozdrawiam.
Mariusz Dalewski napisał(a)
@cysiaczek: przepraszam, nie chciałem nic wytykać tylko bardziej wspomnieć o pozostałych metodach weryfikacji żeby uzupełnić trochę temat.
cysiaczek napisał(a)
Przecież nie piszę tego z oburzeniem ;p. To bardzo dobrze, że pokazałeś słabe strony! Dzięki temu kilka rzeczy poprawię. Dzięki :)
Pitbull199711 napisał(a)
Nieee nooooo jak zaraz nie wytrzymam potrzebny mi pesel i zaden nie pasuje kurna noooooo HELP ME !!!!!!!!!!!!!!!!!!
 
Symfony_button