2013-05-27 363 views
0

我需要此代碼的幫助,是一個信用卡驗證,我一直試圖使它在我的代碼中工作,但我不能,我只需要獲得2個變量,是該卡的工作就應該返回true這樣的作品,但如果沒有它顯示一個錯誤信息,但我也需要獲得回報假的,這裏是代碼:我有一個PHP驗證器,它返回true,但我需要添加假

<?php 
    $cardnumber = $_POST['CardNumber']; 
    $cardname = $_POST['CardType']; 

    $cards = array ( array ('name' => 'American Express', 
    'length' => '15', 
    'prefixes' => '34,37', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Diners Club Carte Blanche', 
    'length' => '14', 
    'prefixes' => '300,301,302,303,304,305', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Diners Club', 
    'length' => '14,16', 
    'prefixes' => '36,38,54,55', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Discover', 
    'length' => '16', 
    'prefixes' => '6011,622,64,65', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Diners Club Enroute', 
    'length' => '15', 
    'prefixes' => '2014,2149', 
    'checkdigit' => true 
    ), 
    array ('name' => 'JCB', 
    'length' => '16', 
    'prefixes' => '35', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Maestro', 
    'length' => '12,13,14,15,16,18,19', 
    'prefixes' => '5018,5020,5038,6304,6759,6761,6762,6763', 
    'checkdigit' => true 
    ), 
         array ('name' => 'MasterCard', 
    'length' => '16', 
    'prefixes' => '51,52,53,54,55', 
    'checkdigit' => true 
    ), 
    array ('name' => 'Solo', 
    'length' => '16,18,19', 
    'prefixes' => '6334,6767', 
    'checkdigit' => true 
    ), 
         array ('name' => 'Switch', 
    'length' => '16,18,19', 
    'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759', 
    'checkdigit' => true 
    ), 
    array ('name' => 'VISA', 
    'length' => '16', 
    'prefixes' => '4', 
    'checkdigit' => true 
    ), 
    array ('name' => 'VISA Electron', 
    'length' => '16', 
    'prefixes' => '417500,4917,4913,4508,4844', 
    'checkdigit' => true 
    ), 
    array ('name' => 'LaserCard', 
    'length' => '16,17,18,19', 
    'prefixes' => '6304,6706,6771,6709', 
    'checkdigit' => true 
    ) 
    ); 

     $ccErrorNo = 0; 

     $ccErrors [0] = "Unknown card type"; 
     $ccErrors [1] = "No card number provided"; 
     $ccErrors [2] = "Credit card number has invalid format"; 
     $ccErrors [3] = "Credit card number is invalid"; 
     $ccErrors [4] = "Credit card number is wrong length"; 

     // Establish card type 
     $cardType = -1; 
     for ($i=0; $i<sizeof($cards); $i++) { 

     // See if it is this card (ignoring the case of the string) 
     if (strtolower($cardname) == strtolower($cards[$i]['name'])) { 
      $cardType = $i; 
      break; 
     } 
     } 

     // If card type not found, report an error 
     if ($cardType == -1) { 
     $errornumber = 0;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     } 

     // Ensure that the user has provided a credit card number 
     if (strlen($cardnumber) == 0) { 
     $errornumber = 1;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     } 

     // Remove any spaces from the credit card number 
     $cardNo = str_replace (' ', '', $cardnumber); 

     // Check that the number is numeric and of the right sort of length. 
     if (!preg_match("/^[0-9]{13,19}$/",$cardNo)) { 
     $errornumber = 2;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     } 

     // Now check the modulus 10 check digit - if required 
     if ($cards[$cardType]['checkdigit']) { 
     $checksum = 0;  // running checksum total 
     $mychar = "";   // next char to process 
     $j = 1;    // takes value of 1 or 2 

     // Process each digit one by one starting at the right 
     for ($i = strlen($cardNo) - 1; $i >= 0; $i--) { 

      // Extract the next digit and multiply by 1 or 2 on alternative digits.  
      $calc = $cardNo{$i} * $j; 

      // If the result is in two digits add 1 to the checksum total 
      if ($calc > 9) { 
      $checksum = $checksum + 1; 
      $calc = $calc - 10; 
      } 

      // Add the units element to the checksum total 
      $checksum = $checksum + $calc; 

      // Switch the value of j 
      if ($j ==1) {$j = 2;} else {$j = 1;}; 
     } 

     // All done - if checksum is divisible by 10, it is a valid modulus 10. 
     // If not, report an error. 
     if ($checksum % 10 != 0) { 
     $errornumber = 3;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     } 
     } 

     // The following are the card-specific checks we undertake. 

     // Load an array with the valid prefixes for this card 
     $prefix = explode(',',$cards[$cardType]['prefixes']); 

     // Now see if any of them match what we have in the card number 
     $PrefixValid = false; 
     for ($i=0; $i<sizeof($prefix); $i++) { 
     $exp = '/^' . $prefix[$i] . '/'; 
     if (preg_match($exp,$cardNo)) { 
      $PrefixValid = true; 
      break; 
     } 
     } 

     // If it isn't a valid prefix there's no point at looking at the length 
     if (!$PrefixValid) { 
     $errornumber = 3;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     } 

     // See if the length is valid for this card 
     $LengthValid = false; 
     $lengths = explode(',',$cards[$cardType]['length']); 
     for ($j=0; $j<sizeof($lengths); $j++) { 
     if (strlen($cardNo) == $lengths[$j]) { 
      $LengthValid = true; 
      break; 
     } 
     } 

     // See if all is OK by seeing if the length was valid. 
     if (!$LengthValid) { 
     $errornumber = 4;  
     $errortext = $ccErrors [$errornumber]; 
     return true; 
     }; 

     // The credit card is in the required format. 
     return true; 

echo $errortext; 
?> 

你可以看到返回值爲true,但是當卡未驗證時我也需要將其更改爲false,以便我可以進行其他驗證,謝謝任何幫助。

我找到了其他的代碼來做我需要的,更簡單一些,可以將這個新代碼的$ verified變量添加到第一個代碼中嗎?這裏是代碼:

<?php 

$cc_number = $_POST['CardNumber']; 
$type = $_POST['CardType']; 

$cc_num = str_replace (' ', '', $cc_number); 

    if($type == "AX") { 
    $denum = "American Express"; 
    } elseif($type == "DC") { 
    $denum = "Diner's Club"; 
    } elseif($type == "DS") { 
    $denum = "Discover"; 
    } elseif($type == "MC") { 
    $denum = "Master Card"; 
    } elseif($type == "VI") { 
    $denum = "Visa"; 
    } 

    if($type == "AX") { 
    $pattern = "/^([34|37]{2})([0-9]{13})$/";//American Express 
    if (preg_match($pattern,$cc_num)) { 
    $verified = true; 
    } else { 
    $verified = false; 
    } 


    } elseif($type == "DC") { 
    $pattern = "/^([30|36|38]{2})([0-9]{12})$/";//Diner's Club 
    if (preg_match($pattern,$cc_num)) { 
    $verified = true; 
    } else { 
    $verified = false; 
    } 


    } elseif($type == "DS") { 
    $pattern = "/^([6011]{4})([0-9]{12})$/";//Discover Card 
    if (preg_match($pattern,$cc_num)) { 
    $verified = true; 
    } else { 
    $verified = false; 
    } 


    } elseif($type == "MC") { 
    $pattern = "/^([51|52|53|54|55]{2})([0-9]{14})$/";//Mastercard 
    if (preg_match($pattern,$cc_num)) { 
    $verified = true; 
    } else { 
    $verified = false; 
    } 


    } elseif($type == "VI") { 
    $pattern = "/^([4]{1})([0-9]{12,15})$/";//Visa 
    if (preg_match($pattern,$cc_num)) { 
    $verified = true; 
    } else { 
    $verified = false; 
    } 

    } 

    if($verified == false) { 
    //Do something here in case the validation fails 
    echo "Credit card invalid. Please make sure that you entered a valid <em>" . $denum . "</em> credit card "; 

    } else { //if it will pass...do something 
    echo "Your <em>" . $denum . "</em> credit card is valid"; 
    } 

?> 
+0

看着你返回所有的地方,考慮你是否願意返回「真」或「假」。就是這樣。不過,如果您對此感到困惑,我建議您不要處理信用卡信息。很難讓這類事情正確,你可能會發現使用別人的信用卡處理庫更容易和更安全。 – Matchu

+0

你不能把'return'置於藍色之外,你應該放在一個'function'體內。無論如何,你應該把你的支票包裝在函數中,以使你的代碼更具可讀性。 – moonwave99

+0

@ moonwave99:我猜這是奇怪的代碼,返回到'include'調用。這是糟糕的形式,但它也是完全有效的。 – Matchu

回答

1

在你的函數的頂部聲明一個變量:

$invalid = false; 

然後到處都在你的代碼,你必須return true;其更改爲:$invalid = true;

然後你可以在你的函數結束時做return $invalid;。如果發生錯誤,它將返回true。如果沒有錯誤,它將返回false

+0

爲什麼分配一個變量並繼續檢查而不是立即返回?另外,'$ invalid'感覺像是一個向後的變量名。 '$ valid'怎麼樣? – Matchu

+0

@Matchu他不想馬上回來。他希望繼續進行驗證,以便爲每個錯誤生成所有錯誤消息。當出現錯誤時他也會返回'true',這就是爲什麼我將變量命名爲'invalid'的原因。對我來說似乎倒退了,但對於我們所知道的,這可能在一個名爲'is_invalid'的函數內。 – Paulpro

+0

感謝您的回答,好像似乎有想法,但沒有工作給我 – Skylex

0

看所有的if語句是這樣的:

$errornumber = whateverNumber; 
$errortext = $ccErrors [$errornumber]; 
return true; 

這些都是什麼返回true時出現錯誤。只需在這些地方將return語句更改爲return false;,以使腳本返回false。

唯一的return true;應該在你的函數結束。

+0

你好,謝謝你的答覆,以及我只是這樣做,似乎工作,但我只需要像這樣配置一個IF變量:if(return == true){echo'work'; } elseif(return == false){echo $ errortext; } – Skylex

0

感謝您的幫助,這裏是最後的代碼,我只是做出一些改變和偉大工程:

$cards = array ( array ('name' => 'American Express', 
          'length' => '15', 
          'prefixes' => '34,37', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Diners Club Carte Blanche', 
          'length' => '14', 
          'prefixes' => '300,301,302,303,304,305', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Diners Club', 
          'length' => '14,16', 
          'prefixes' => '36,38,54,55', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Discover', 
          'length' => '16', 
          'prefixes' => '6011,622,64,65', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Diners Club Enroute', 
          'length' => '15', 
          'prefixes' => '2014,2149', 
          'checkdigit' => true 
         ), 
        array ('name' => 'JCB', 
          'length' => '16', 
          'prefixes' => '35', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Maestro', 
          'length' => '12,13,14,15,16,18,19', 
          'prefixes' => '5018,5020,5038,6304,6759,6761,6762,6763', 
          'checkdigit' => true 
         ), 
        array ('name' => 'MasterCard', 
          'length' => '16', 
          'prefixes' => '51,52,53,54,55', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Solo', 
          'length' => '16,18,19', 
          'prefixes' => '6334,6767', 
          'checkdigit' => true 
         ), 
        array ('name' => 'Switch', 
          'length' => '16,18,19', 
          'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759', 
          'checkdigit' => true 
         ), 
        array ('name' => 'VISA', 
          'length' => '16', 
          'prefixes' => '4', 
          'checkdigit' => true 
         ), 
        array ('name' => 'VISA Electron', 
          'length' => '16', 
          'prefixes' => '417500,4917,4913,4508,4844', 
          'checkdigit' => true 
         ), 
        array ('name' => 'LaserCard', 
          'length' => '16,17,18,19', 
          'prefixes' => '6304,6706,6771,6709', 
          'checkdigit' => true 
         ) 
       ); 

    $ccErrorNo = 0; 

    $ccErrors [0] = "Unknown card type"; 
    $ccErrors [1] = "No card number provided"; 
    $ccErrors [2] = "Credit card number has invalid format"; 
    $ccErrors [3] = "Credit card number is invalid"; 
    $ccErrors [4] = "Credit card number is wrong length"; 

    // Establish card type 
    $cardType = -1; 
    for ($i=0; $i<sizeof($cards); $i++) { 

    // See if it is this card (ignoring the case of the string) 
    if (strtolower($cardname) == strtolower($cards[$i]['name'])) { 
     $cardType = $i; 
     $response = true; 
     break; 
    } 
    } 

    // If card type not found, report an error 
    if ($cardType == -1) { 
    $errornumber = 0;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    } 

    // Ensure that the user has provided a credit card number 
    if (strlen($cardnumber) == 0) { 
    $errornumber = 1;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    } 

    // Remove any spaces from the credit card number 
    $cardNo = str_replace (' ', '', $cardnumber); 

    // Check that the number is numeric and of the right sort of length. 
    if (!preg_match("/^[0-9]{13,19}$/",$cardNo)) { 
    $errornumber = 2;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    } 

    // Now check the modulus 10 check digit - if required 
    if ($cards[$cardType]['checkdigit']) { 
    $checksum = 0;         // running checksum total 
    $mychar = "";         // next char to process 
    $j = 1;           // takes value of 1 or 2 

    // Process each digit one by one starting at the right 
    for ($i = strlen($cardNo) - 1; $i >= 0; $i--) { 

     // Extract the next digit and multiply by 1 or 2 on alternative digits.  
     $calc = $cardNo{$i} * $j; 

     // If the result is in two digits add 1 to the checksum total 
     if ($calc > 9) { 
     $checksum = $checksum + 1; 
     $calc = $calc - 10; 
     } 

     // Add the units element to the checksum total 
     $checksum = $checksum + $calc; 

     // Switch the value of j 
     if ($j ==1) {$j = 2;} else {$j = 1;}; 
    } 

    // All done - if checksum is divisible by 10, it is a valid modulus 10. 
    // If not, report an error. 
    if ($checksum % 10 != 0) { 
    $errornumber = 3;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    } 
    } 

    // The following are the card-specific checks we undertake. 

    // Load an array with the valid prefixes for this card 
    $prefix = explode(',',$cards[$cardType]['prefixes']); 

    // Now see if any of them match what we have in the card number 
    $PrefixValid = false; 
    for ($i=0; $i<sizeof($prefix); $i++) { 
    $exp = '/^' . $prefix[$i] . '/'; 
    if (preg_match($exp,$cardNo)) { 
     $PrefixValid = true; 
     $response = true; 
     break; 
    } 
    } 

    // If it isn't a valid prefix there's no point at looking at the length 
    if (!$PrefixValid) { 
    $errornumber = 3;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    } 

    // See if the length is valid for this card 
    $LengthValid = false; 
    $lengths = explode(',',$cards[$cardType]['length']); 
    for ($j=0; $j<sizeof($lengths); $j++) { 
    if (strlen($cardNo) == $lengths[$j]) { 
     $LengthValid = true; 
     $response = true; 
     break; 
    } 
    } 

    // See if all is OK by seeing if the length was valid. 
    if (!$LengthValid) { 
    $errornumber = 4;  
    $errortext = $ccErrors [$errornumber]; 
    $response = false; 
    return false; 
    }; 

    // The credit card is in the required format. 
    return $response; 
在其他頁面

$cardnumber = $_POST['CardNumber']; 
$cardname = $_POST['CardType']; 

require('phpcreditcard.php'); 



    if ($response == true) { 
     echo 'works'; 
    } 
    elseif ($response == false) { 
    echo $errortext; 
    } 
相關問題