Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Generator sumy kontrolnej, Generator sumy kontrolnej konta bankowego.
Durkane
post 28.07.2015, 12:18:06
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

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


Witam. Otóż mam mały problem ze zrobieniem takiego generatora. Podaje kod poniżej, wydaje mi się, że moja funkcja liczy źle modulo : / Jak ustawie w funkcji zamiast $num $acc to jaki numer konta nie podam to ciągle wylicza sumę kontrolną 98. Zaznaczam, że dopiero uczę się programowania w php (jestem testerem i dostałem takie zadanie domowe od programistów php)

  1. <?php
  2. $n_acc = (string)$_POST["n_acc"];
  3. $acc = $n_acc."252100";
  4.  
  5. if (strlen($n_acc) != 20)
  6. {
  7. echo "Numer konta jest za krotki lub za dlugi. Podaj 20 cyfr.";
  8. } else {
  9.  
  10. function mod ($num)
  11. {
  12. $acc = $n_acc."252100";
  13.  
  14. for ($i=0; $i<strlen($num);$i++)
  15. {
  16. $CheckSum = "";
  17. $CheckSum .= $num[$i];
  18. $CheckSum = (string)((int)$CheckSum%97);
  19. }
  20.  
  21. if ($CheckSum < 10)
  22. {
  23. $CheckSum = "0".$CheckSum;
  24. }
  25. return $CheckSum;
  26. }
  27.  
  28. $CheckSum = mod($n_acc);
  29. $CheckSum = 98 - (int)$CheckSum;
  30.  
  31. echo "Podany numer konta : ", wordwrap($acc, 4, " ", 1),"<br>";
  32. echo "Suma kontrolna : ".$CheckSum."<br>";
  33.  
  34.  
  35. $CheckAcc = $n_acc."2521".$CheckSum;
  36. $Check = mod($CheckAcc);
  37.  
  38. echo "Sprawdzanie : ".$Check."<br>";
  39.  
  40. if ($Check == 1)
  41. {
  42. echo "Suma kontrolna prawidlowa.<br>";
  43. } else {
  44. echo "Suma kontrolna nieprawidlowa.<br>" ;
  45. }
  46. $Account = $CheckSum." ".$acc;
  47. echo "Numer konta z suma kontrolna : ", wordwrap($Account, 4, " ", 1),"<br>";
  48. }
  49. ?>


Tutaj podaje do html'a kod jakby ktoś potrzebował.
  1. <form action ="Nowy2.php" method ="POST">
  2.  
  3. <div align="center">
  4. <br><br>
  5. <h3> Wpisz 20 cyfrowy numer konta</h3>
  6.  
  7. <input type="text" name="n_acc" </input><br><br>
  8. <input type="submit" value="Generuj"> <br>
  9.  
  10. </div>
  11.  
  12. </form>
  13. </body>
  14. </html>


Ten post edytował Durkane 28.07.2015, 12:20:00
Go to the top of the page
+Quote Post
Jarma
post 28.07.2015, 13:32:42
Post #2





Grupa: Zarejestrowani
Postów: 36
Pomógł: 11
Dołączył: 20.07.2009

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


Nie możesz odnieść się do i-tego znalu ciągu za pomocą $num[$i];
Stwórz najpierw zmienną która będzie tablicą. Pomocne może być str_split

PS.
Po co jest to:
  1. if ($CheckSum < 10)
  2. {
  3. $CheckSum = "0".$CheckSum;
  4. }

Skoro później robisz to
  1. (int)$CheckSum


Ten post edytował Jarma 28.07.2015, 13:34:29
Go to the top of the page
+Quote Post
Durkane
post 28.07.2015, 14:56:07
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

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


  1. if ($CheckSum < 10)
  2. {
  3. $CheckSum = "0".$CheckSum;
  4. }


Suma kontrolna musi mieć 2 cyfry, więc jeżeli wychodzi od 0 do 9 to musimy z przodu dodać 0. Wiem, że jest do tego funkcja odpowiednia smile.gif Ale w tym momencie niestety nie pamiętam jej nazwy.

Później daje
  1. (int)$CheckSum
po to, aby mieć pewność, że odejmując
  1. 98 - $CheckSum
to moje $CheckSum będzie intem (nie ufam za bardzo temu, że PHP samo zamienia na odpowiedni typ).

Czyli jeżeli dobrze rozumiem to użyć str_split na
  1. $num[$i]
?snitch.gif

Ten post edytował Durkane 28.07.2015, 14:57:47
Go to the top of the page
+Quote Post
CuteOne
post 28.07.2015, 18:20:11
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Ta funkcja nie ma sensu. Każdy obrót pętli, to nadpisanie poprzedniej wartości w CheckSum - wynieś inicjalizowanie zmiennej z pętli i podmień
  1. $CheckSum .= $num[$i];
  2. $CheckSum = (string)((int)$CheckSum%97);

na
  1. $CheckSum .= $num[$i] % 97;


Ten post edytował CuteOne 28.07.2015, 18:22:18
Go to the top of the page
+Quote Post
Durkane
post 28.07.2015, 19:46:43
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

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


Ale to będzie brać po 1 liczbie i robić modulo dla jednej liczby. A z tego co mi tłumaczył programista algorytm to ma robić modulo i brać kolejną liczbę i dodawać do wyniku z modulo tzn. np. z modulo mamy 3, a następna liczba to 2, więc kolejny krok to 32%97. Czy to co podałeś będzie tak robić?
Bo to co wkleiłem na początku cały czas podaje mi różne wartości natomiast jeżeli usunę
  1. $acc = $n_acc."252100";
to wtedy suma kontrolna cały czas jest 98...

Ale jutro sprawdzę Twoim sposobem i zobaczymy jak to wyjdzie smile.gif Na razie dziękuję za pomoc.
Go to the top of the page
+Quote Post
mls
post 28.07.2015, 20:35:53
Post #6





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

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


Po pierwsze, numer konta bankowego w Polsce powinien mieć 28 znaków.
Po drugie, wg np. Wikipedii:
Cytat
Algorytm sprawdzania cyfr kontrolnych:

Weź pełny numer konta (razem z kodem kraju), bez spacji.
Sprawdź, czy zgadza się długość numeru dla danego kraju.
Przenieś 4 pierwsze znaki numeru na jego koniec.
Przekształć litery w numerze konta na ciągi cyfr, zamieniając 'A' na '10', 'B' na '11' itd., aż do 'Z' na '35' (dla Polski 2521).
Potraktuj otrzymany ciąg znaków jak liczbę i wylicz resztę z dzielenia przez 97.
Jeśli reszta jest równa 1, to numer konta ma prawidłowe cyfry kontrolne.


Po trzecie - przyjmując, że numer konta jest poprawny (zaczyna się od "PL"):
  1. function check ($number)
  2. {
  3. $number = substr($number, 4) . substr($number, 0, 4);
  4. foreach (str_split(substr(preg_replace_callback('/([A-Z])/', function ($match) { return (ord($match[0]) - 55); }, $number), 0, -2) . '00', 6) as $n)
  5. $r = (int)((isset($r) ? $r : '') . $n) % 97;
  6. return strcmp(sprintf('%02d', 98 - $r), substr($number, -2)) == 0;
  7. }

gdzie sprawdzenie może wyglądać np. tak:
  1. $iban = 'PL91106000760000331000154960';
  2. echo('Numer ' . $iban . ' jest ' . (check($iban) ? 'poprawny' : 'błędny'));


Ten post edytował mls 28.07.2015, 20:43:14


--------------------
Go to the top of the page
+Quote Post
Durkane
post 30.07.2015, 10:12:49
Post #7





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

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


Dobra dziękuje za pomoc smile.gif Już sobie poradziłem i ładnie zlicza tongue.gif
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 - 00:29