EAN13 Prüfsumme berechnen

Zero2000

Erfahrenes Mitglied
Hallo

Ich habe mir vorgenommen ein Script zur Berechnung von EAN13 Prüfziffern zu schreiben.
Ich habe nun sehr umständlich angefangen und würde es aber gern einfacher machen wollen.
Da ich nicht so bewandert bin im tieferen Umgang mit PHP wollte ich die Experten unter euch mal fragen wie ich es einfacher machen könnte.

Dazu mal Sichpunkte:
  • EAN als ganzes eingeben können (inputfeld) und in ein Array einlesen damit später Berechnungen jeder einzelnen Zahl moeglich ist.
  • da die berechnete Zahl durch 10 geteilt wird, bleibt manchmal ein Rest, mit dem gerechnet werden muß. z.B. 6,3 dann brauche ich die 3(der Rest) als Zahl zum weiterrechnen.
Habt Ihr diesbezüglich Lösungsansätze für mich?

MfG Maik
 
Für den Rest ist der Modulo-Operator (Restdivision) nicht verkehrt:
Arithmetische Operatoren.

EDIT: Ein Beispiel zum extrahieren der Ziffern:
PHP:
<?php
$ean=" ISBN 3-499-13599";

function toDigitArray($ean) {
    $s=preg_replace("/([^\d])/","",$ean);
    $a=array();
    for ($i=0;$i<strlen($s);$i++) {
        $a[]=$s{$i};
    }
    return $a;
}
print_r(toDigitArray($ean));
?>

EDIT2: Man sieht, es ist nicht so ganz mein Thema, die ISBN ist keine EAN-13-Nummer, sondern nur das erstbeste, was ich bei Google über "EAN-13 beispiel" gefunden habe. Die Funktion funktioniert aber auch mit EAN-13, nur das das zurückgegebene Array dann etwas größer ist.

EDIT3: Spoiler:
PHP:
<?php
function checkEAN13($ean) {
    $s=preg_replace("/([^\d])/","",$ean);
    $result=array();
    $result['ean13']=$s;
    if (strlen($s)==12) {
        $result['process']="build";
    } else if (strlen($s)==13) {
        $result['process']="check";
        $result['checknr']=$s{12};
    } else {
        $result['error']="Not an EAN-13";
        return($result);
    }
    $check=0;
    for ($i=0;$i<12;$i++) {
        $check+=(($i%2)*2+1)*$s{$i};
    }
    $check=(10-($check%10))%10;
    if ($result['process']=="check" && $result['checknr']==$check) {
        $result['check']="OK";
        $result['buildnr']=$check;
    } else if ($result['process']=="check") {
        $result['check']="NOT OK";
        $result['buildnr']=$check;
    } else {
        $result['buildnr']=$check;
    }
    return $result;
}
print_r(checkEAN13("978382731710"));
echo "<br>\n";
print_r(checkEAN13("9783827317104"));
echo "<br>\n";
print_r(checkEAN13("9783827317100"));
echo "<br>\n";
print_r(checkEAN13("978381582086"));
echo "<br>\n";
print_r(checkEAN13("9783815820862"));
echo "<br>\n";
print_r(checkEAN13("9783815820865"));
?>

Edit4: Spoiler in 2 einfachen Funktionen:
PHP:
function buildEAN13Checksum($ean) {
    $s=preg_replace("/([^\d])/","",$ean);
    if (strlen($s)!=12) {
        return false;
    }
    $check=0;
    for ($i=0;$i<12;$i++) {
        $check+=(($i%2)*2+1)*$s{$i};
    }
    $check=(10-($check%10))%10;
    return $check;
}

function checkEAN13($ean) {
    $s=preg_replace("/([^\d])/","",$ean);
    if (strlen($s)==13 && buildEAN13Checksum(substr($s,0,12))==$s{12}) {
        return true;
    }
    return false;
}

Gruß hpvw
 
Zuletzt bearbeitet:
Danke...
Mit deinem "Spoiler" gehts gut, aber ich habe es dann doch anderst gemacht.
Sicher umständlich und ich muß mir das mal mit dem Array angucken.
Ich habe 5 inputfelder in denen ich die 5 Nummern die man dort zur Verfügung hat eingibt und dann lasse ich Ihn Rechnen und benutze da natürlich den Modulo-Operator.
Das funktioniert soweit ganz gut...

Werde das ganze noch ein wenig verbessern wenn ich das mit dem Array raus habe.

MfG Maik

Danke für deine Mühe... Ich weiß das wirklich zu schätzen.
 
Zuletzt bearbeitet:
Also funktionieren tut mein EAN-Prüfsummenrechner.
Ich habe jetzt nur das Problem wenn ich mir z.B. gleich 10 EAN's erstellen lasse mittels for-Schleife, dann nimmt er immer die Prüfsumme die er als erstes berechnet für alle anderen auch.
Hier mal mein Code vielleicht kann jemand helfen...
PHP:
<?
echo "<form method='post' action='barcodefill.php'>";
echo "<input type='text' name='a' maxlength='1' size='1'> <input type='text' name='b' maxlength='1' size='1'> <input type='text' name='c' maxlength='1' size='1'> <input type='text' name='d' maxlength='1' size='1'> <input type='text' name='e' maxlength='1' size='1'> ";
echo "<input type='submit' value='Anzeigen' name='submit'>";
echo "</form>";

if(isset($submit))
{
#### Berechnung ###
$c_basis = 33;
$c_a = $a*3;
$c_b = $b*1;
$c_c = $c*3;
$c_d = $d*1;
$c_e = $e*3;
$calc = $c_basis+$c_a+$c_b+$c_c+$c_d+$c_e;
$finalcalc=(10-($calc%10))%10;
###################
$basis = 4044515;
echo "<b>$basis$a$b$c$d$e<font color='#ff0000'>$finalcalc</font></b><br><br>";//Die stimmt...
for($x=10000;$x<=10010;$x++)
{
echo "<b>$basis$x<font color='#ff0000'>$finalcalc</font></b><br>";
}
}
?>
Das ist meine ursprüngliche Version! Auch wenn ich die Berechnung mit in die Schleife nehme gibt es immer nur ein und dieselbe Prüfziffer.
 
Lösung:
PHP:
<?
echo "<form method='post' action='barcodefill.php'>";
echo "<input type='text' name='a' maxlength='1' size='1'> <input type='text' name='b' maxlength='1' size='1'> <input type='text' name='c' maxlength='1' size='1'> <input type='text' name='d' maxlength='1' size='1'> <input type='text' name='e' maxlength='1' size='1'> ";
echo "<input type='submit' value='Anzeigen' name='submit'>";
echo "</form>";

if(isset($_POST['submit'])) {
    #### Berechnung ###
    $c_basis = 33;
    $c_a = $_POST['a']*3;
    $c_b = $_POST['b'];
    $c_c = $_POST['c']*3;
    $c_d = $_POST['d'];
    $c_e = $_POST['e']*3;
    $calc = $c_basis+$c_a+$c_b+$c_c+$c_d+$c_e;
    $finalcalc=(10-($calc%10))%10;
    ###################
    $basis = 4044515;
    echo "<b>$basis$a$b$c$d$e<font color='#ff0000'>$finalcalc</font></b><br><br>";//Die stimmt...
    for($x=10000;$x<=10010;$x++) {
        $s=(string)$x;
        $c_basis = 33;
        $c_a = $s{0}*3;
        $c_b = $s{1};
        $c_c = $s{2}*3;
        $c_d = $s{3};
        $c_e = $s{4}*3;
        $calc = $c_basis+$c_a+$c_b+$c_c+$c_d+$c_e;
        $finalcalc=(10-($calc%10))%10;
        echo "<b>$basis$x<font color='#ff0000'>$finalcalc</font></b><br>";
    }
}
?>
Ich vermute mal, Du hast $a etc. nicht mit den Ziffern der Laufvariable $x ersetzt.
Ausserdem solltest Du Deinen Code etwas übersichtlicher formatieren und das superglobale Array $_POST verwenden. Zudem rate ich Dir, wie ich es in den Beispielen angedeutet habe, die Berechnung in einer Funktion durchzuführen.
BTW: Mit 1 muss man nicht multiplizieren, es ändert sich nichts.

Gruß hpvw
 
Hallo

Das funktioniert so prima. Danke.
mit 1 multiplizieren..... :suspekt: naja Mathe 5 :rolleyes:

Was genau bewirkt denn diese Zeile?
PHP:
$s=(string)$x;

MfG Maik
 
Das ändert den Datentyp, der in PHP fast nie relevant ist, hier jedoch schon, zumindest in meinem PHP5.
Der Inhalt des int x wird in einen String umgewandelt und in s abgelegt.
Beispiel:
PHP:
<?php
$i=12345;
$s=(string)$i;
echo "i=";
var_dump($i);
echo ":".$i{3};
echo "<br>\n";
echo "s=";
var_dump($s);
echo ":".$s{3};
/* Output (PHP5 mit meinen Einstellungen):
    i=int(12345) :
    s=string(5) "12345" :4
*/
?>
Man kann nicht auf das Zeichen 3 eines Integers zugreifen, da ein Integer keine Zeichen hat und in diesem Fall keinen automatischen Typecast erfährt.

Gruß hpvw
 
Zurück