Home » IBAN-Prüfung mit PHP

IBAN-Prüfung mit PHP

Geschrieben in PHP,Webentwicklung von Michael am 5 Oktober 2007

Die internationale Kontonummer IBAN wird immer öfter auch ein Thema für Programmierer. Erst einmal wird sie im erleichterten europäischen Zahlungsverkehr immer häufiger genutzt, und dann kann man die IBAN per Software gut nach verschiedene Kriterien geprüften.

  • Sie darf (ohne Leerzeichen) nicht länger als 36 Zeichen sein.
  • In jedem europäischen Land hat sie eine feste Länge (in Deutschland 22 Zeichen). Ein Liste der Länge und der Aufteilung in Bankleitzahl und Kontonummer steht hier bei Wikipedia
  • Die zweite und dritte Stelle der IBAN ist eine errechnete Prüfsumme, die per Software errechnet oder geprüft werden kann.

Ich zeige hier, wie die Berechnung und Prüfung in einem PHP-Programm durchgeführt werden kann. Das Ganze ist deswegen etwas spannend, weil eine Modulo-Rechnung, also eine Ganzzahl-Division mit einer bis zu 38-stelligen Ganzzahl durchgeführt werden muss. Wegen der meist nur zur Verfügung stehenden 32-Bit-CPUs können mit PHP aber nur maximal 9 Stellen mit allen Ziffern genutzt werden. Deshalb muss die Modulo-Rechnung in mehere Teilschritte zerlegt werden.

function test_iban( $iban ) {
    $iban = str_replace( ' ', '', $iban );
    $iban1 = substr( $iban,4 )
        . strval( ord( $iban{0} )-55 )
        . strval( ord( $iban{1} )-55 )
        . substr( $iban, 2, 2 );

    $rest=0;
    for ( $pos=0; $pos<strlen($iban1); $pos+=7 ) {
        $part = strval($rest) . substr($iban1,$pos,7);
        $rest = intval($part) % 97;
    }
    $pz = sprintf("%02d", 98-$rest);

    if ( substr($iban,2,2)=='00')
        return substr_replace( $iban, $pz, 2, 2 );
    else
        return ($rest==1) ? true : false;
}

Diese PHP-Funktion ergänzt die richtige Prüfziffer, wenn beim Aufruf der Funktion eine IBAN mit Prüfziffern “00″ übergeben wird. Wird dagegen eine vollständige IBAN mit Prüfziffer übergeben, gibt es als Rückgabe “true” wenn die Prüfziffer zu der IBAN passt, andernfalls gibt es das Ergebnis “false”.

Diese Berechnung bezieht sich übrigens nur auf die einheitlichen IBAN-Prüfziffern an der dritten und vierten Stelle der IBAN. In manchen Ländern werden weiter hinten auch noch Prüfziffern zu den eigentlichen Kontonummern hinzugefügt. Diese müssen vor der Berechnung mit der hier gezeigten Funktion schon bekannt sein. Das Wissen um diese weiteren Prüfziffern ist eher nur von Bedeutung, wenn man aus einer IBAN die nationalen Bankdaten ableiten möchte. Wer es ganz genau wissen möchte, findet auf dieser Webseite die Informationen, wo die zusätzlichen Prüfziffern stehen, und dort gibt es auch Links zu Dokumenten der jeweiligen nationalen IBAN-Regeln.

15 Kommentare to 'IBAN-Prüfung mit PHP'

Kommentare abonnieren per RSS or TrackBack to 'IBAN-Prüfung mit PHP'.

  1. m.s. aus f. said,

    on Juli 1st, 2008 at 09:12

    super funktion :)


  2. on September 8th, 2008 at 17:54

    [...] IBAN-Prüfung und Berechnung mit PHP – Danke Michael Schummel! Übrigens noch interessant, wie so eine IBAN-Nummer aufgebaut ist. [...]

  3. Matthias said,

    on Januar 19th, 2012 at 11:21

    Einfach Klasse!

    Danke für Deinen Einsatz.

    VG

  4. Tino said,

    on August 1st, 2012 at 16:17

    Ich hab nirgendwo Code zur Erzeugung deutscher IBAN gefunden, daher hier mein Ansatz:

    $blz8 = str_pad ( $blz, 8, “0″, STR_PAD_RIGHT);
    $kontonr10 = str_pad ( $kontonr, 10, “0″, STR_PAD_LEFT);
    $bban = $blz8 . $kontonr10;
    $pruefsumme = $bban . “131400″;
    $modulo = (bcmod($pruefsumme,”97″));
    $pruefziffer =str_pad ( 98 – $modulo, 2, “0″,STR_PAD_LEFT);
    $iban = “DE” . $pruefziffer . $bban;

  5. chakme said,

    on Februar 7th, 2013 at 11:33

    Super Code, allerdings funktioniert er anscheinend nur für deutsche IBANs,
    GB87 BARC 2065 8244 9716 55 wird zum Beispiel als falsch angezeigt. Würde es vielleicht auch international funktionieren, wenn man alle Buchstaben im IBAN durch Zahlen ersetzt? Oder hast du da eine andere Lösung?

  6. chakme said,

    on Februar 7th, 2013 at 12:35

    Das hier funktioniert nun international, hab nur noch eine For-Schleife eingebaut, die alle Buchstaben durch die Zahlen 10 – … ersetzt…

    function validIban($field, $msg) {
    $iban = $this->_getValue($field);
    $iban = str_replace( ‘ ‘, ”, $iban );
    $iban1 = substr( $iban,4 )
    . strval( ord( $iban{0} )-55 )
    . strval( ord( $iban{1} )-55 )
    . substr( $iban, 2, 2 );
    for ( $i = 0; $i64) && (ord( $iban1{$i} )<91)) {
    $iban1 = substr($iban1,0,$i).strval( ord( $iban1{$i} )-55 ).substr($iban1,$i+1);
    }
    }
    $rest=0;
    for ( $pos=0; $pos_errorList[] = array(“field” => $field, “value” => $iban, “msg” => $msg);
    }

  7. chakme said,

    on Februar 7th, 2013 at 12:38

    Da wurde was nicht richtig angezeigt… Hier nochmal die entscheidende For-Schleife:

    for ( $i = 0; $i64) && (ord( $iban1{$i} )<91)) {
    $iban1 = substr($iban1,0,$i).strval( ord( $iban1{$i} )-55 ).substr($iban1,$i+1);
    }
    }

  8. Emile said,

    on Juli 25th, 2013 at 16:42

    Ich habe die Funktionen zur Prüfung und Konvertierung geprüft und lesbar zusammengefasst.
    Download auf http://donauweb.at/ebusiness-blog/2013/07/25/iban-und-bic-statt-konto-und-blz/

  9. Michael Radke said,

    on Januar 4th, 2014 at 03:18

    Moin Moin!

    Die Scripte funktionieren gut – AAAABER…

    Für Konten der Deutschen Bank wird mir bei Prüfung auf http://www.iban-rechner.de/iban_validieren.html immer ein Fehler angezeigt.

    Hier geht es wohl um Unter-Kontonummern. Ich frage mich, wie relevant dies sein kann!?!?

    Beispiel:
    Kontonr.:6XXX877
    BLZ:20070000
    ergibt IBAN:DE42200700000006XXX877

    Obiges Tool sagt:
    Der Aufbau dieser IBAN scheint falsch zu sein. Richtig müsste diese IBAN wohl heißen: DE392007000006XXX87700

    Die Berücksichtigung von Unterkonten war bislang egal (Lastschriften haben immer funktioniert), wird das nun existentiell??

    Viele Grüße!
    Michael Radke

  10. Frank said,

    on Januar 14th, 2014 at 18:09

    Hallo Michael

    Die Unterkontenproblematik gibt es auch bei 2-3 anderen Banken.
    Grundsätzlich ist die Kontonummer im IBAN 10 Stellen lang. Wird das Unterkonto, also z.B. die beiden Nullen nicht angegeben, wird somit die Kontonummer kürzer.
    Im IBAN wird die Kontonummern aber vorne mit Füllnullen aufgefüllt. Was dazu führt, dass sich die Prüfsumme (die ersten 2 Zahlen nach der Länderkennung “DE”) sich verändert und die ganze IBAN somit nicht valide ist. An deinem Beispiel kannst du es schön nachvollziehen. Statt der Prüfziffer “39″ hast du ohne Angabe des Unterkontos die “42″.

    Grüße,
    Frank

  11. Carlos Quiterio said,

    on April 10th, 2014 at 09:31

    Hallo Michael,

    ich suche eine PHP Funktion zur Berechnung der IBAN und BIC, die ich in einer bestimmten Weseite einbauen kann. Das ergebnis, IBAN und BIC werden dann in einer Datenbank gespeichert.
    Hättest Du da was?
    Herzlichen Dank.
    Mit freundlichen Grüßen,
    Carlos Quiterio

  12. Pascal said,

    on Mai 6th, 2014 at 10:12

    Die Berechnung ganz oben funktioniert leider nicht richtig. Und die Schleife in den Kommentaren hat Syntaxfehler.

    http://www.iban.de (und meine Bankkarte) liefert bei gleicher BLZ und KTO# eine völlig andere Zahl.

  13. Marcel said,

    on Juni 22nd, 2014 at 12:21

    Leider wird auch z.B. die Fehlerhafte IBAN “DE23 2004 1133 0008 3033 07″ als richtig erkannt :( Aber das passiert auch bei vielen IBAN-Rechnern z.B. http://www.iban-rechner-bic.de

    Gibt es da irgendwie abhilfe sowas zu erkennen für PHP? :(

  14. Mis ... said,

    on Oktober 15th, 2015 at 13:15

    Mis …

    blog topic

  15. chr wiedemann said,

    on Februar 18th, 2016 at 12:50

    Super, Danke für die Funktion

Kommentieren

XHTML: Du kannst folgende Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>