Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzenie poprawności numeru PESEL
Forum PHP.pl > Forum > PHP
niedzwiedz
Mam w tabeli ~16 000 numerów PESEL i chciałbym sprawdzić ich poprawność. Znalazłem taki kod:
  1. <?php
  2. function check_pesel($pesel)
  3. {
  4. if (strlen($pesel) != 11 || !is_numeric($pesel))
  5.  return 0;
  6. $steps = array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  7. for ($x = 0; $x < 10; $x++) {
  8. $sum_nb += $steps[$x] * $pesel[$x];
  9. }
  10. $sum_m = 10 - $sum_nb % 10;
  11. if ($sum_m == 10)
  12.  $sum_c = 0;
  13. else
  14.  $sum_c = $sum_m;
  15. if ($sum_c == $pesel[10])
  16.  return 1;
  17. return 0;
  18. } 
  19. ?>

no ale jak podpiąć do tego tabelę i uzyskać wyniki??

Proszę o pomoc!
scanner
Bazy danych -> php
Jeśli dane masz w MySQLu:

  1. <?php
  2. // ... db connection
  3. $strSQLQuery = 'SELECT pesel FROM users';
  4. $resSQL = mysql_query( $strSQLQuery ) or die( mysql_error() );
  5. while($arrRow = mysql_fetch_row( $resSQL ) )
  6. {
  7. $blnTest = check_pesel( $arrRow['pesel'] );
  8. if ( !$blnTest )
  9. {
  10. echo $arrRow['pesel'].' is invalid !<br />';
  11. }
  12. }
  13. ?>
lukio
Z tego co znam się na programowaniu to funkcja is_numeric nie jest najlepszym rozwiązaniem na sprawdzanie czy zmienna (w tym przypadku $pesel) jest numeryczna, czyli składa się z samych cyfr. Dlaczego? Otóż funkcja is_numeric zwraca true w przypadku kiedy badana zmienna należy do zbioru A={0,1,2,3,4,5,6,7,8,9,.,-} Czyli jak widać przyjmuje również wartości zmiennoprzecinkowe czyli PESEL np: "8407.50443" przejdzie przez warunek - if (!is_numeric($pesel)) return false - jako true, a nie powinien.

Co do numeru PESEL do dużo ciekawych informacji na jego temat znalazłem na stronce http://pesel.php64.pl
phpion
Lol gościu, jesteś archeologiem z zamiłowania czy co? 4 lata różnicy w postach - chyba ustanowiłeś nowy rekord!
lukio
Wielu ludzi szuka informacji na temat numeru PESEL i jak trafi na tego posta to przynajmniej czegoś się nauczy. Bo przez 4 lata każdy nowoczesny język programowanie trochę ewaluował. Dzięki za docinkę.

Pozdrawiam
kobe
To dla tych co szukają zostawię małą wskazówkę
  1. <?php
  2. function check_pesel($pesel)
  3. {
  4.  global $pesel_sex;
  5.  
  6.  if (strlen($pesel) != 11 || !is_numeric($pesel)) return 0;
  7.  if (($pesel[9] % 2) == 0) $pesel_sex = ' kobieta';
  8. else $pesel_sex = 'mężczyzna';
  9.  
  10. $steps = array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  11. for ($x = 0; $x < 10; $x++) $sum_nb += $steps[$x] * $pesel[$x];
  12. $sum_m = 10 - $sum_nb % 10;
  13. if ($sum_m == 10) $sum_m = 0;
  14. if ($sum_m == $pesel[10]) return 1;
  15. return 0;
  16. }
  17.  
  18. /* przykład użycia 
  19.  
  20. $pesel="77080301316";
  21.  
  22. if (check_pesel($pesel) != 0){
  23.  
  24.    echo "PESEL: $pesel <br>\nrPłeć: $pesel_sex";
  25.  
  26. } else {
  27.  
  28.    echo "Numer PESEL: <i>$pesel</i> jest nieprawidłowy";
  29. }
  30.  
  31. */
  32. ?>



Dorzucę też od razu weryfikację nr kont bankowego ;-)

  1. <?php
  2. function nrb($nrb) {
  3. $nrb=preg_replace("/[^0-9]/","",$nrb);
  4. if (strlen($nrb)<>26) return 0;
  5. $nrb .="252100";
  6. $wagi = array(57,93,19,31,71,75,56,25,51,73,17,89,38,62,45,
  7. 53,15,50,5,49,34,81,76,27,90,9,30,3,10,1);
  8. for ($i=0; $i<30;$i++) $suma += $nrb[$i+2]*$wagi[$i];
  9. $liczba = sprintf("%02d", 98 - $suma%97);
  10. if ($nrb[0]==$liczba[0] and $nrb[1]==$liczba[1]) return 1;
  11. return 0;
  12. }
  13.  
  14. /* przykład użycia
  15.  
  16. $numer="07109010790417338226000401";
  17.  
  18. if (nrb($numer)) echo "NRB poprawny";
  19. else echo "NRB błędny";
  20. */
  21. ?>



Teraz wystarczy tą funkcję wstawić w pętle i wszystko
lukio
"Kobe" funkcja is_numeric nie służy do sprawdzania czy dana zmienna składa się z samych cyfr.
Ktoś napisze jakiś skrypt, reszta tylko go kopiuje i myśli że skoro wszyscy tak robią to jest dobrze.
A nie jest...

is_numeric zwraca true gdy np zmienna będzie miała wartość: "-3453.34545" - a to chyba nie jest prawidłowy numer PESEL biggrin.gif

Pozdro 500
DeyV
ehh smile.gif
http://phpedia.pl/wiki.php?title=WalidacjaNumerow

A apropo algorytmu - tutaj is_numeric nie służy walidacji numeru Pesel, tylko optymalizacji algorytmu - w końcu jeśli jakiś ciąg nie spełnia tego warunku, na pewno pseselem nie będzie. A jeśli ten warunek spełni, a peselem poprawnym nie jest, zostanie to wykryte w kolejnym kroku..
lukio
Jakiej optymalizacji algorytmu?
Wykonanie operacji która nic nie daje to jest według Ciebie optymalizacja.
Po co wykrywać coś w następnych krokach, jeżeli można to sprawdzić wcześniej i zakończyć działanie skryptu: return false;

Co do strony z walidacjami to:
  1. <?php
  2. if (strlen($str) != 11 || !is_numeric($str)) //sprawdzamy czy ciąg ma 11 znaków
  3. ?>


Zgadzam się z komentarzem, sprawdzamy czy ciąg ma 11 znaków, ale walidacja numeru PESEL polega na sprawdzeniu czy ciąg ma 11 cyfr

Co do zastosowania tej funkcji to sprawdź sobie czy numer: 44444444444 jest poprawnym numerem PESEL.
Okazuje się że funkcja "mówi" TAK - a przecież nie mamy miesiąca który ma 44 dni, no chyba że ja żyje w innym świecie.

Pozdro 500
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.