Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sprawdzenie poprawności numeru PESEL
niedzwiedz
post 5.12.2003, 09:35:49
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 5.12.2003
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
scanner
post 5.12.2003, 09:57:56
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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. ?>


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
lukio
post 1.12.2007, 13:11:26
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.05.2006
Skąd: Bydgoszcz

Ostrzeżenie: (10%)
X----


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

Ten post edytował lukio 1.12.2007, 14:29:50
Go to the top of the page
+Quote Post
phpion
post 1.12.2007, 13:16:22
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Lol gościu, jesteś archeologiem z zamiłowania czy co? 4 lata różnicy w postach - chyba ustanowiłeś nowy rekord!
Go to the top of the page
+Quote Post
lukio
post 1.12.2007, 13:20:02
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.05.2006
Skąd: Bydgoszcz

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
kobe
post 1.12.2007, 15:34:33
Post #6





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 7.12.2004
Skąd: planeta -> ZIEMIA | kontynent -> EUROPA | kraj -> Polska | województwo -> ŁÓDZKIE | miasto -> TOMASZÓW MAZ

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
lukio
post 2.12.2007, 10:41:08
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.05.2006
Skąd: Bydgoszcz

Ostrzeżenie: (10%)
X----


"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
Go to the top of the page
+Quote Post
DeyV
post 2.12.2007, 13:15:39
Post #8





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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..


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
lukio
post 2.12.2007, 13:24:43
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.05.2006
Skąd: Bydgoszcz

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 01:53