Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript][PHP]Generator numeru pesel JS-> PHP
Elber
post 9.11.2011, 10:17:25
Post #1





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

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


Witam,

szukałem wczoraj dość długo generatora numerów pesel w PHP ... zamiast tego znalazłem w JS ... Tylko nie za bardzo wiem jak przerobić to na PHP.

Wygenerowane liczby chcę zakodować w mcrypt i przesłać do innego skryptu, rozkodować i sprawdzić czy wygenerowane liczby są prawidłowe smile.gif Algorytm numeru PESEL idealnie się do tego nadaje, jednak nie wiem jak wygenerować PESEL w PHP. Podaję kod w JS który znalazłem:

Kod
function getDigit()
{
    return Math.floor(Math.random() * 10);
}
function calcPesel(date, sex)
{
    var wagi = new Array (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);

    var fullYear = date.getFullYear();
    var y=fullYear % 100;
    var m=date.getMonth()+1;
    var d=date.getDate();
    
    if (fullYear>=1800 && fullYear<=1899){
        m += 80;
    } else
    if (fullYear>=2000 && fullYear<=2099){
        m += 20;
    } else
    if (fullYear>=2100 && fullYear<=2199){
        m += 40;
    } else
    if (fullYear>=2200 && fullYear<=2299){
        m += 60;
    }
    
    var cyfry = new Array (Math.floor(y/10),y%10,Math.floor(m/10),m%10,Math.floor(d/10),d%10);
    for (var i = cyfry.length; i < wagi.length-1; i++)
        cyfry[i] = getDigit();
    if (sex == 'M'){
        cyfry[wagi.length-1] = getLetter('13579');
    } else if (sex == 'F'){
        cyfry[wagi.length-1] = getLetter('02468');
    } else {
        cyfry[wagi.length-1] = getDigit();
    }
        
    var cyfra_kontrolna = 0;
    for (var i=0; i<cyfry.length; i++)
        cyfra_kontrolna += wagi[i] * cyfry[i];
    cyfra_kontrolna = (10 - (cyfra_kontrolna % 10)) % 10;
                
    var r = '';
    for (var i=0; i<cyfry.length; i++)
        r += String(cyfry[i]);
    r += String(cyfra_kontrolna);    
    return r;
}


--------------------
GG: 564555
Go to the top of the page
+Quote Post
blooregard
post 9.11.2011, 10:40:55
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Ale w czym masz problem?

Masz w tym kodzie same if-y i for-y plus jedna deklaracja tablicy i jedno wywołanie f-cji floor() plus f-cje daty.

Zamieniasz linijka po linijce na kod zgodny ze składną PHP (wywalasz var, przed nazwami zmiennych dodajesz $ itd.) i po robocie. Tam, gdzie masz wywołania f-cji pomieniasz na analogiczne z PHP ( floor(), date() ).


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Elber
post 9.11.2011, 11:15:30
Post #3





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

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


OK wink.gif Więc próbuję, mam coś takiego:

  1. <?php
  2.  
  3. function getDigit()
  4. {
  5. return floor(rand() * 10);
  6. }
  7.  
  8. function getLetter($letters)
  9. {
  10. $letters = $letters || 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  11. $len = strlen($letters);
  12. $i = floor(rand() * $len);
  13. $l = $letters{$i};
  14. return l;
  15. }
  16.  
  17. function calcPesel()
  18. {
  19. $wagi = Array (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  20.  
  21. $d=getdate();
  22. $fullYear = $d['year'];
  23. $y=$fullYear % 100;
  24. $m=$d['mon']+1;
  25. $d=$d['mday'];
  26.  
  27. if ($fullYear>=1800 && $fullYear<=1899){
  28. $m += 80;
  29. } else
  30. if ($fullYear>=2000 && $fullYear<=2099){
  31. $m += 20;
  32. } else
  33. if ($fullYear>=2100 && $fullYear<=2199){
  34. $m += 40;
  35. } else
  36. if ($fullYear>=2200 && $fullYear<=2299){
  37. $m += 60;
  38. }
  39.  
  40. $cyfry = Array (floor($y/10),$y%10,floor($m/10),$m%10,floor($d/10),$d%10);
  41. for ($i = strlen($cyfry); $i < strlen($wagi)-1; $i++)
  42. $cyfry[$i] = getDigit();
  43.  
  44. $cyfry[strlen($wagi)-1] = getDigit();
  45.  
  46. $cyfra_kontrolna = 0;
  47. for ($i=0; $i<strlen($cyfry); $i++)
  48. $cyfra_kontrolna += $wagi[$i] * $cyfry[$i];
  49. $cyfra_kontrolna = (10 - ($cyfra_kontrolna % 10)) % 10;
  50.  
  51. $r = '';
  52. for ($i=0; $i<strlen($cyfry); $i++)
  53. $r += $cyfry[$i];
  54. $r += $cyfra_kontrolna;
  55. return $r;
  56. }
  57.  
  58.  
  59. echo calcPesel();
  60.  
  61. ?>


I błędy :
Kod
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 41
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 41
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 41
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 44
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 47
Warning: strlen() expects parameter 1 to be string, array given in pesel.php on line 52 0



----Edit:

Trochę pozamieniałem to z tym strlen i teraz mam kod:
  1. <?php
  2.  
  3. function getDigit()
  4. {
  5. return floor(rand() * 10);
  6. }
  7.  
  8. function calcPesel(){
  9. $wagi = Array (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  10.  
  11. $d=getdate();
  12. $fullYear = $d['year'];
  13. $y=$fullYear % 100;
  14. $m=$d['mon']+1;
  15. $d=$d['mday'];
  16.  
  17. if ($fullYear>=1800 && $fullYear<=1899){
  18. $m += 80;
  19. } else
  20. if ($fullYear>=2000 && $fullYear<=2099){
  21. $m += 20;
  22. } else
  23. if ($fullYear>=2100 && $fullYear<=2199){
  24. $m += 40;
  25. } else
  26. if ($fullYear>=2200 && $fullYear<=2299){
  27. $m += 60;
  28. }
  29.  
  30. $cyfry = Array (floor($y/10),$y%10,floor($m/10),$m%10,floor($d/10),$d%10);
  31. for ($i = $cyfry; $i < $wagi-1; $i++){
  32. $cyfry[$i] = getDigit();
  33. $cyfry[$wagi-1] = getDigit();
  34. }
  35.  
  36. $cyfra_kontrolna = 0;
  37. for ($i=0; $i<$cyfry; $i++)
  38. $cyfra_kontrolna .= $wagi[$i] * $cyfry[$i];
  39. $cyfra_kontrolna = (10 - ($cyfra_kontrolna % 10)) % 10;
  40.  
  41. $r = '';
  42. for ($i=0; $i<$cyfry; $i++)
  43. $r .= $cyfry[$i];
  44. $r .= $cyfra_kontrolna;
  45. return $r;
  46. }
  47.  
  48. ?>


I błąd:
Kod
Fatal error: Unsupported operand types in pesel.php on line 31


Ten post edytował Elber 9.11.2011, 11:54:33


--------------------
GG: 564555
Go to the top of the page
+Quote Post
blooregard
post 9.11.2011, 12:09:06
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




  1. (...)
  2. $cyfry = Array (floor($y/10),$y%10,floor($m/10),$m%10,floor($d/10),$d%10);
  3. for ($i = $cyfry; $i < $wagi-1; $i++){ //$cyfry to tablica -> tak sie nie da
  4.  
  5. (...)


Jak chcesz do $i przypisac tablicę, no to się nie dziw, że masz błąd


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Elber
post 9.11.2011, 12:10:52
Post #5





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

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


A jak ten błąd naprawić ? Bo kombinuję i to jest moment w którym jestem bezradny sad.gif


--------------------
GG: 564555
Go to the top of the page
+Quote Post
amii
post 9.11.2011, 12:29:29
Post #6





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

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


nie strlen a count


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
Elber
post 9.11.2011, 14:04:30
Post #7





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

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


Już tak próbowałem, ale jak odpalę to to cały czas myśli ... nic się nie wyświetla tylko cały czas się coś robi ...

  1. <?php
  2.  
  3. function getDigit()
  4. {
  5. return floor(rand() * 10);
  6. }
  7.  
  8. function calcPesel(){
  9. $wagi = Array (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  10.  
  11. $d=getdate();
  12. $fullYear = $d['year'];
  13. $y=$fullYear % 100;
  14. $m=$d['mon']+1;
  15. $d=$d['mday'];
  16.  
  17. if ($fullYear>=1800 && $fullYear<=1899){
  18. $m += 80;
  19. } else
  20. if ($fullYear>=2000 && $fullYear<=2099){
  21. $m += 20;
  22. } else
  23. if ($fullYear>=2100 && $fullYear<=2199){
  24. $m += 40;
  25. } else
  26. if ($fullYear>=2200 && $fullYear<=2299){
  27. $m += 60;
  28. }
  29.  
  30. $cyfry = Array (floor($y/10),$y%10,floor($m/10),$m%10,floor($d/10),$d%10);
  31. for ($i = count($cyfry); $i < count($wagi)-1; $i++){
  32. $cyfry[$i] = getDigit();
  33. $cyfry[count($wagi)-1] = getDigit();
  34. }
  35.  
  36. $cyfra_kontrolna = 0;
  37. for ($i=0; $i<$cyfry; $i++){
  38. $cyfra_kontrolna .= $wagi[$i] * $cyfry[$i];
  39. $cyfra_kontrolna = (10 - ($cyfra_kontrolna % 10)) % 10;
  40. }
  41.  
  42. $r = '';
  43. for($i=0; $i<$cyfry; $i++){
  44. $r .= $cyfry[$i];
  45. $r .= $cyfra_kontrolna;
  46. }
  47.  
  48. return $r;
  49. }
  50.  
  51.  
  52. calcPesel();


Teraz wpadłem na pomysł że można trochę to obejść ... ale nie jest to zbyt optymalne rozwiązanie ...

  1.  
  2. function getDigit()
  3. {
  4. return floor(rand() * 10);
  5. }
  6.  
  7. function pesel($pesel)
  8. {
  9. $pesel = preg_replace('/([^0-9]*)/', '', $pesel);
  10. if ( strlen($pesel) != 11)
  11. {
  12. return 0; //zła długość
  13. }
  14. $suma='';
  15. $wagi = array(1,3,7,9,1,3,7,9,1,3); //sprawdzanie sumy kontrolnej
  16. for ($i=0; $i<10; $i++)
  17. {
  18. $suma += $pesel[$i]*$wagi[$i];
  19. }
  20. $liczba = 10 - $suma%10;
  21. if ( $liczba == 10 )
  22. {
  23. $liczba=0;
  24. }
  25. if ( $pesel[10] == $liczba )
  26. {
  27. return 1;
  28. }
  29. else
  30. {
  31. return 0;
  32. }
  33. }
  34.  
  35. $j=0;
  36. for($i=0; $j<=0; $i++){
  37. $pes=getDigit();
  38. if(pesel($pes)=='1'){
  39. $j++;
  40. echo $i.' - '.$pes.'<br />';
  41. }
  42. }
  43.  


Taki kod wyświetli mi poprawny kod pesel, jednak chyba lepszym i szybszym rozwiązaniem byłoby naprawić ten kod wyżej smile.gif Ma ktoś jakiś pomysł jak to zrobić ?


--------------------
GG: 564555
Go to the top of the page
+Quote Post
mls
post 9.11.2011, 22:35:27
Post #8





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

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


Funkcja z pierwszego posta przepisana prawie 1 do 1 w PHP. Działa, aczkolwiek możnaby to napisać dużo ładniej i dużo prościej.

  1. function getDigit ()
  2. {
  3. return rand(0, 9);
  4. }
  5.  
  6. function getLetter ($letters)
  7. {
  8. return $letters[rand(0, strlen($letters) - 1)];
  9. }
  10.  
  11. function calcPesel ($date = false, $sex = false)
  12. {
  13. $wagi = array(1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
  14. $date = $date === false ? time() : (!is_numeric($date) && strlen($date) == 10 ? strtotime($date) : (int)$date);
  15.  
  16. $fullYear = (int)date('Y', $date);
  17. $y = $fullYear % 100;
  18. $m = (int)date('m', $date);
  19. $d = (int)date('d', $date);
  20.  
  21. if ($fullYear >= 1800 && $fullYear <= 1899)
  22. $m += 80;
  23. elseif ($fullYear >= 2000 && $fullYear <= 2099)
  24. $m += 20;
  25. elseif ($fullYear >= 2100 && $fullYear <= 2199)
  26. $m += 40;
  27. elseif ($fullYear >= 2200 && $fullYear <= 2299)
  28. $m += 60;
  29.  
  30. $cyfry = array(floor($y / 10), $y % 10, floor($m / 10), $m % 10, floor($d / 10), $d % 10);
  31.  
  32. for ($i = count($cyfry); $i < count($wagi) - 1; $i ++)
  33. $cyfry[$i] = getDigit();
  34.  
  35. if (strtoupper($sex) == 'M')
  36. $cyfry[count($wagi) - 1] = getLetter('13579');
  37. elseif (strtoupper($sex) == 'F')
  38. $cyfry[count($wagi) - 1] = getLetter('02468');
  39. else
  40. $cyfry[count($wagi) - 1] = getDigit();
  41.  
  42. $cyfra_kontrolna = 0;
  43. for ($i = 0; $i < count($cyfry); $i ++)
  44. $cyfra_kontrolna += $wagi[$i] * $cyfry[$i];
  45. $cyfra_kontrolna = (10 - ($cyfra_kontrolna % 10)) % 10;
  46.  
  47. $r = '';
  48. for ($i = 0; $i < count($cyfry); $i ++)
  49. $r .= $cyfry[$i];
  50. $r .= $cyfra_kontrolna;
  51. return $r;
  52. }


Ten post edytował mls 9.11.2011, 22:36:23


--------------------
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: 24.04.2025 - 04:46