Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Generator sumy kontrolnej
Forum PHP.pl > Forum > Przedszkole
Durkane
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>
Jarma
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
Durkane
  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
CuteOne
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;
Durkane
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.
mls
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'));
Durkane
Dobra dziękuje za pomoc smile.gif Już sobie poradziłem i ładnie zlicza tongue.gif
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.