Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Generator numeru PESEL
Malinaa
post 28.01.2020, 15:54:13
Post #1





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Usiłuję wykonać generator numeru PESEL KOD TUTAJ
Mam prośbę o sprawdzenie i poprawienie błędów.

Ten post edytował Malinaa 29.01.2020, 13:50:55


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 28.01.2020, 16:44:39
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Nie bede ocenial czy prawidlowo to generujesz, ale pare poprawek odnosnie kodu

1) Zacznij uzywac PSR bo tragicznie sie czyta twoj kod, albo uzywaj php-cs-fixer co ci juz mowiono. A najlepiej i to ito
2) uzywaj === - tez zdaje ci sie juz mowilem. Po co pytasz o poprawy kodu skoro potem i tak sie nie stosujesz do wskazowek
3) brak typowania
4) Po co losujesz 2 liczby skoro i tak uzywasz zawsze jednej? array_rand($arrMale, 2);
5)
if ($pRadioOptions == 'male') {
$arand = array_rand($arrMale, 2);
$sex = $arrMale[$arand[0]];
}
else {
$arand = array_rand($arrFemale, 2);
$sex = $arrFemale[$arand[0]];
}

Strasznie duza i bezsensowna duplikacja. Pomysl jak to poprawic
6) Jak juz uzywasz [] a nie array() to badz konsekwentny a nie raz to a raz tamto


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 28.01.2020, 17:49:39
Post #3





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


1) PSR jest tu taka ilość materiału, że nie wiem jak się za to zabrać (a kod na dzisiaj).
2) === jak mam stosować jak nie znam zastosowania (w PHP 5 nie stosowałem, a 7 dopiero zacząłem używać)
3) typowanie tzn. try i catch - myślałem, że to tylko przy zapytaniach SQL
5) dobra byłaby tu jedna tablica
$arrSex = array (
'male' => array (1, 3, 5, 7, 9),
'female' => array (0, 2, 4, 6, 8)
);
ale jak tu wylosować liczbę dla wartości male lub female?
6) jak rozumiem nowa składnia tablicy, powinna wyglądać tak:
$arrSex = [
'male' => [1, 3, 5, 7, 9],
'female' => [0, 2, 4, 6, 8]
];
Czy to masz na myśli?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 28.01.2020, 17:56:29
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




ad2) No naprawde nie potrafisz zajrzec do manuala?
https://www.php.net/manual/en/language.oper....comparison.php

ad3) Typowanie a nie lapanie wyjatkow. Typowanie czyli okreslanie typow dla zmiennych oraz typow dla zwrotek funkcji

ad5) Nie, nie kazalem ci robic z tego tablicy wielowymiarowej, tylko usunac duplikacje smile.gif Choc przepisanie tego na wielowymiarowke tez mozna. Usuniecie duplikacje w tym przypadku bedzie podobne

Ad6 No tak, zmiana array() na []

ad1) Na poczatek zacznij od psr-1 oraz psr-12.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 28.01.2020, 18:24:48
Post #5





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


2. Wiem co oznacza operator
=== identyczne
== równe
ale jeszcze nie czuję różnicy podobnie jak z array a [] .
Tablice już poczułem smile.gif

3. zacząłem w kodzie dodawać przed zmiennymi (int), (string)...
chociaż tak sobie mi to jeszcze wychodzi.

5. Jeden jaki przyszedł mi pomysł na tę duplikacje to napisanie funkcji

Kod
function randomSex($arrValues = []) {
$arrRand = array_rand($arrValues, 2);
$sex = $arrValues[$arrRand[0]];
return $sex;
}

// Sex
if ($pRadioOptions == 'male') {
$sex = randomSex($arrMale);
}
else {
$sex = randomSex($arrFemale);
}

ale kiedy usunę te 2:
$arrRand = array_rand($arrValues);
nie działa?

Ten post edytował Malinaa 28.01.2020, 18:25:04


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 28.01.2020, 19:45:16
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
ale kiedy usunę te 2:
$arrRand = array_rand($arrValues);
nie działa?

Bo nie czytasz manuala....
Cytat
When picking only one entry, array_rand() returns the key for a random entry. Otherwise, an array of keys for the random entries is returned.


Cytat
Jeden jaki przyszedł mi pomysł na tę duplikacje to napisanie funkcji

No i widzisz jak ladnie. Jak chcesz to potrafisz smile.gif Ja bym to jednak jeszcze troszke przerobil:
  1. function randomSex($arrValues) { //USUWAM = [] - jest zbedne
  2. return $arrValues[array_rand($arrValues)]; // DAJE OD RAZU return. Nie ma potrzeby generowac zbednej zmiennej sex jak mozesz wynik od razu zwrocic
  3. }
  4.  
  5. $sex = $pRadioOptions === 'male' ? randomSex($arrMale) : randomSex($arrFemale);


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 28.01.2020, 20:38:10
Post #7





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Czytałem wymienione zdanie, ale nie skumałem co z tym zrobić.

Piękna jest ta funkcja. Jestem pełen podziwu: piękna, czysta i wspaniała jak kwiat doskonała smile.gif
Myślałem, że o takich rzeczach tylko się marzy, a tu proszę.

Opowiedz jeśli można o tym:
$sex = $pRadioOptions === 'male' ? randomSex($arrMale) : randomSex($arrFemale);
kiedyś zdarzyło mi się pisać taki kod, ale obecnie średnio kumam wink.gif
jak to działa === ? : i gotowe (proste, bez cudowania z ifami - super)

Teraz jest tak: https://dbm.org.pl/

Pozostała kosmetyka, kłopot jest z inputem.
Jak dam input hidden nie kopiuje. Jak ukryć input, ale aby kopiowało numer?

Ten post edytował Malinaa 29.01.2020, 13:52:28


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 28.01.2020, 21:47:05
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
Czytałem wymienione zdanie, ale nie skumałem co z tym zrobić.

Tam bylo napisane, ze jak dasz 1 to zwroci ci od razu wylosowany element. Jak dasz wiecej niz 1, to zwroci ci tablic elementow.
A na przyszlosc jak nie wiesz co pisza, to rob var_dump() i patrz co dostajesz. No banalniejszej metody na sprawdzanie juz nie ma.

Odnosnie ?: znowu odsylam do manuala
https://www.php.net/manual/en/language.oper...parison.ternary

Co do pola ukrytego:
widocznie nie dziala z polami ukrytymi.
Tu masz obejscie
https://stackoverflow.com/questions/3159329...xt-to-clipboard


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 28.01.2020, 22:22:51
Post #9





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Dziękuję bardzo. I kosmetyka została poprawiona.

Jest jeszcze fragment kodu... nie najlepszy.
Czy możemy ten fragment poprawić?

Kod
  // 10 digits number
  $fdigits = $lyear.$cmonth.$day.$rnumber.$sex;
  
  // Check digit
  $arrDigits = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7];
  
  $number = (string)$fdigits;
  $strlen = strlen($number);
  $count = 0;
  for ($i=0; $i<$strlen; $i++) {
    $count = $count + ((int)$arrDigits[$i] * (int)$number[$i]);
    $count ++;
  }
  
  $control_number = substr(strstr($count/10, '.'), 1);
  if ($control_number == '') $control_number = 0;
  
  // PESEL
  $pesel = $fdigits.$control_number;



--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
trueblue
post 28.01.2020, 22:38:21
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Nie musisz zmieniać na hidden. Wystarczy, że przesuniesz input poza ekran.


--------------------
Go to the top of the page
+Quote Post
nospor
post 29.01.2020, 10:18:18
Post #11





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Pomijajac PSR, === oraz zbedne rzutowanie na INT w jednym miejscu to

substr(strstr($count/10, '.'), 1); - czyli chcesz pobrac reszte z dzielenia przez 10? Do tego sluzy MODULO czyli % w php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 29.01.2020, 12:10:02
Post #12





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Poprawiłem, teraz jest tak

Kod
  // 10 digits (number)
  $digits_number = $year_last.$month_number.$day.$random_number.$sex;
  
  // Number sum
  $arrBalance = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7];
  
  $number = (string)$digits_number;
  $strlen = strlen($number);
  $digit_sum = 0;
  
  for ($i=0; $i<$strlen; $i++) {
    $digit_sum += ($arrBalance[$i] * (int)$number[$i]);
  }
  
  // Checksum
  $checksum = $digit_sum % 10;
  
  // PESEL
  $pesel = $digits_number.$checksum;


Pomińmy PSR (w tym kodzie), gdzie tutaj można użyć === ? INT - czy o ten chodziło.
MODULO czy teraz jest dobrze?

Zobaczyłem jeszcze jedno

Kod
// Month
  $month_number = $arrMonthsMore[(int)$year_first][(int)$month];
  if (strlen($month_number) < 2) $month_number = (int)'0'.$month_number;


W większości przypadków liczba (dla miesięcy) jest dwu cyfrowa, ale
dla lat 1900-1999 są liczby jedno cyfrowe i brakuje 0 z przodu liczby
przez co PESEL ma 10 nie 11 cyfr. Jak dodać 0 przed liczbą: 1, 2, 3... (01, 02, 03)


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 29.01.2020, 12:14:02
Post #13





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
gdzie tutaj można użyć ===
No teraz w kodzie nie masz juz zadnego porownania wiec nigdzie,

Tak, o ten INT chodzilo

Zacznij uzywac PHP BBCODE a nie CODE - zle sie czyta co wstawiasz

MODULO ok

Cytat
Jak dodać 0 przed liczbą: 1, 2, 3... (01, 02, 03)
Oj leniuszk leniuszku...
https://www.php.net/manual/en/function.str-pad.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 29.01.2020, 13:27:43
Post #14





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Również poprawione, jest dobrze.
  1. $month_number = str_pad($arrMonthsMore[(int)$year_first][(int)$month], 2, '0', STR_PAD_LEFT);

Jeszcze tylko PSR i będzie super.

Ten post edytował Malinaa 29.01.2020, 13:28:15


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
nospor
post 29.01.2020, 14:52:41
Post #15





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Tak na totalnym marginesie:

nie: nie prawidłowa
a: nieprawidłowa

"nie " z przymiotnikami piszemy razem wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Malinaa
post 29.01.2020, 15:14:21
Post #16





Grupa: Zarejestrowani
Postów: 517
Pomógł: 6
Dołączył: 21.07.2008

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


Totalnie nie zwróciłem uwagi w skrypcie na pisownie
i machnąłem orta (późno, ale poprawione).

Zapytałbym jeszcze o inny temat, na który nie znalazłem jeszcze sposobu:
http://forum.php.pl/index.php?showtopic=267491
Może ktoś wie więcej, jak zrobić taką ocenę dobrze?


--------------------
I welcome you on the Internet >>> Design by Malina
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: 28.03.2024 - 20:30