0

I have this code

 function checkIBAN($iban)
{
    $iban = strtolower(str_replace(' ','',$iban));
    $Countries = array('al'=>28,'ad'=>24,'at'=>20,'az'=>28,'bh'=>22,'be'=>16,'ba'=>20,'br'=>29,'bg'=>22,'cr'=>21,'hr'=>21,'cy'=>28,'cz'=>24,'dk'=>18,'do'=>28,'ee'=>20,'fo'=>18,'fi'=>18,'fr'=>27,'ge'=>22,'de'=>22,'gi'=>23,'gr'=>27,'gl'=>18,'gt'=>28,'hu'=>28,'is'=>26,'ie'=>22,'il'=>23,'it'=>27,'jo'=>30,'kz'=>20,'kw'=>30,'lv'=>21,'lb'=>28,'li'=>21,'lt'=>20,'lu'=>20,'mk'=>19,'mt'=>31,'mr'=>27,'mu'=>30,'mc'=>27,'md'=>24,'me'=>22,'nl'=>18,'no'=>15,'pk'=>24,'ps'=>29,'pl'=>28,'pt'=>25,'qa'=>29,'ro'=>24,'sm'=>27,'sa'=>24,'rs'=>22,'sk'=>24,'si'=>19,'es'=>24,'se'=>24,'ch'=>21,'tn'=>24,'tr'=>26,'ae'=>23,'gb'=>22,'vg'=>24);
    $Chars = array('a'=>10,'b'=>11,'c'=>12,'d'=>13,'e'=>14,'f'=>15,'g'=>16,'h'=>17,'i'=>18,'j'=>19,'k'=>20,'l'=>21,'m'=>22,'n'=>23,'o'=>24,'p'=>25,'q'=>26,'r'=>27,'s'=>28,'t'=>29,'u'=>30,'v'=>31,'w'=>32,'x'=>33,'y'=>34,'z'=>35);

    try{
        $cntr=(in_array(substr($iban,0,2),$Countries)) ? $Countries[substr($iban,0,2)] : false;
    if(strlen($iban) == $cntr){
        $MovedChar = substr($iban, 4).substr($iban,0,4);
        $MovedCharArray = str_split($MovedChar);
        $NewString = "";
        foreach($MovedCharArray AS $key => $value){
            if(!is_numeric($MovedCharArray[$key])){
                $MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];
            }
            $NewString .= $MovedCharArray[$key];
        }
        if(bcmod($NewString, '97') == 1)
        {
            return TRUE;
        }
        else{
            return FALSE;
        }
    }
    else{
        return FALSE;
    }
    }catch (Exception $e) {
        report($e);
        return false;
    }

}

And I receive this exception in Laravel

{message: "Undefined offset: 21", exception: "ErrorException",…} exception : "ErrorException" "Undefined offset: 21" in this string $Countries[substr($iban,0,2)]

How can I run from Exception and receive just a false in this case? Because of that fact that my function which is checking iban must receive only true or false not an Exception. If I receive an Exception that is 500error in Ajax

enter image description here

Jason Aller
  • 3,541
  • 28
  • 38
  • 38
David
  • 181
  • 1
  • 2
  • 8

1 Answers1

0

There are quite a few tested iban validation libraries on the packagist. https://packagist.org/?q=iban&p=0 I'd use one of these instead.

Much better than some crusty code copied off another stackoverflow question.

A "ErrorException" is laravel's error handler turning a php error into an exception. You can avoid the error by adding checks before doing array access.

Consider this example:

$MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];

It assumes that $MovedCharArray has an index of $key and assumes that $Chars has an index of $MovedCharArray[$key]. If any of those don't exist, you'll get that error.

Add some checks before attempting to access those array elements and you can avoid the error.

if(isset($MovedCharArray[$key]) && isset($Chars[$MovedCharArray[$key]])){
  $MovedCharArray[$key] = $Chars[$MovedCharArray[$key]];
}else{
  //Some error condition you'll need to deal with.
}
txyoji
  • 6,680
  • 1
  • 44
  • 46