PX : code

fahmi by fahmi
Download this code


<?PHP
/* 
**    Nucleus Information Service Inc.
**    Author: J.A.Greant ( zak@nucleus.com )
**    Date  : October 28, 1999
**
**    This function is based on similar functions by:
**        Brett Error (brett@interwebdesign.com)
**        mcmer (webmaster@artconcept.at)
**
**    Major differences include:
**        Cleaner, easier-to-read validation algorithm.
**        Returns an error message.
**        Returns the type of card based on the number provided.
**
**    This function returns an associative array that will contain the associative keys
**        valid: a true or false result indicating if the card is valid or not
**        type : a string containing the type of the credit card
**             : may return 'American Express','Mastercard','Visa' OR 'unknown'
**    The array may also contain a key named error.
**        error: a string containing an error message indicating the reason why the card number was invalid.
**
**    This function only validates Amex, Mastercard and Visa numbers.
**
**    The method of validation is based on the Luhn check
**        (see http://www.beachnet.com/~hstiles/cardtype.html) 
**
**    If you modify this code or if you find an error in the code, please write me!
**        Zak Greant (zak@nucleus.com)
**
**    This code is provided "As Is" with no warrantees express or implied.
**    The author, his employer and any contributors are not liable for 
**    any damages resulting from the use of this code.
**
*/

FUNCTION credit_card_validator$credit_card_number )
{     

    
# Clean out any non-numeric characters in $credit_card_number
    
$credit_card_number EREG_REPLACE'[^0-9]',''$credit_card_number );
    
    
$ccn_length STRLEN$credit_card_number );
    
    
# Find the type of the card based on the prefix and length of the card number
    
IF( EREG'^3[4|7]'$credit_card_number ) && $ccn_length == 15 )
        
$type 'American Express';
    ELSE IF( 
EREG'^4'$credit_card_number )  && ( $ccn_length == 13 || $ccn_length == 16 ) )
        
$type 'Visa';
    ELSE IF( 
EREG'^5[1-5]'$credit_card_number ) && $ccn_length == 16 )
        
$type 'Mastercard';
    ELSE
        RETURN ARRAY( 
'valid' => false'type' => 'unknown''error' => 'This is not a valid number for an American Express, Mastercard or Visa Card. Please re-enter the number or use a different card.' );

    
# Reverse the credit card number
    
$x STRREV$credit_card_number );

    
# Loop through the reversed credit card number one digit at a time. Transform odd numbered entries and sum with even entries
    
FOR( $i 0;  $i $ccn_length $i++ )
        IF( 
$i # Test to see if the current string index ( $i ) is odd.
            
$sum += ( ( $x$i ] % ) * ) + FLOOR( ( $x$i ] / ) ); # This formula is equivalent to multiplying a number by two and then, if the result has two digits, summing the two digits.
        
ELSE
            
$sum += $x$i ];

    IF( ! ( 
$sum 10 ) ) # If the result, divided by 10 has no fractional remainer, then the card # is valid.
        
RETURN ARRAY( 'valid' => true'type' => $type );
    ELSE
        RETURN ARRAY( 
'valid' => false'type' => $type'error' => "This is not a valid number for a $type Card. Please re-enter the card number or use a different card." );

?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.