Sokszor szükséges, hogy a felhasználók által begépelt számokat valamilyen szinten ellenőrizni tudjuk. Ilyen esetekben szokás a számsorozatot már eleve úgy kinyomtatni/elküldeni/publikálni, hogy az a későbbi bevitel folyamán már tartalmazzon egy ellenőrző számot.
Egy ilyen módszer CDV algoritmus. Lényege, hogy a számsorozat számjegyeit összeadjuk, de úgy, hogy minden második számjegynek a háromszorosát adjuk az összesítőhöz. A végén az 1 digites ellenőrző számunk az összeg utolsó számjegye, azaz a 10-el való osztásának maradéka lesz.
PHP-ban, vagy javascript-ben a megvalósítása viszonylag egyszerű, de jómagam a mysql függvényeit és szintaktikáját még nem forgatom olyan hatékonysággal, mint ahogy az előbbi nyelvekét.
Az én helyzetemben ráadásul a számok már az ellenőrző kóddal vannak tárolva, és a következő értéket is ebből kell előállítanom.
Jöjjön tehát a függvény:
CREATE DEFINER=`root`@`localhost` FUNCTION `createReferenceNumber`() RETURNS int(11)
READS SQL DATA
BEGIN
DECLARE _i INT;
DECLARE _cdv INT;
DECLARE _maxref INT;
DECLARE _maxref_char VARCHAR(10);
SELECT MAX(reference_number) INTO _maxref FROM voucher;
IF _maxref = 0 THEN
-- default
SET _maxref = 80000000;
END IF;
SET _maxref_char = TRIM(CONVERT((FLOOR(_maxref / 10) + 1), CHAR(10))); -- remove old CDV number
SET _i = 1;
SET _cdv = 0;
WHILE _i < LENGTH(_maxref_char) +1 DO
IF _i % 2 = 0 THEN
SET _cdv = _cdv + CONVERT(SUBSTRING(_maxref_char, _i, 1), UNSIGNED);
ELSE
SET _cdv = _cdv + CONVERT(SUBSTRING(_maxref_char, _i, 1), UNSIGNED) * 3;
END IF;
SET _i = _i + 1;
END WHILE;
SET _maxref = CONVERT(_maxref_char, UNSIGNED) * 10 +(_cdv % 10);
RETURN _maxref;
END
A fenti példában a voucher adattáblából keressük ki az utolsó már ellenőrzőkóddal ellátott értéket és ebből állítjuk elő a következő értéket amit ellátunk a CDV számmal.
PHP-ban a következőképpen néz ki:
public static function CDV($number) {
if (!is_numeric($number)) return -1;
for ($i=0; $i<strlen((string)$number); $i++) {
if ( $i % 2 == 1) {
$retval += substr($number, $i, 1);
} else {
$retval += substr($number, $i, 1) * 3;
}
}
return (string)$number . (string)($retval % 10);
}
Amikor a felhasználó visszagépeli vagy esetleg az OCR alrendszer beszúrja a felsimert kódot, könnyedén tudjuk ellenőrizni, hogy sérült-e a kód vagy sem. A módszer nem garantál 100%-os hibafelismerést, de egy tévesztésnél biztosan felismeri a hibás kódot.
Létezik egy másik típusú ellenőrző kód is, azt majd a következő bejegyzésben ismertetjük.

