Form query...

Associate
Joined
19 Oct 2004
Posts
218
Hi guys!

OK ive got a form requesting credit card details.... is there a way i can set a txtfield so it requires 16 characters so they cant put too many or too little in... ?


Sorry if that doesnt make sense....


Cheers guys! :)
 
Sorry, should have made it clearer... i want the minimum lenth to be 16... ive already set the maxlength

Oh and its not live on the net :)
 
In PHP:
Code:
<?
if(strlen($var) != 16){
//Error handling code
}
?>

Server-side testing is vitally important; client-side validation (Javascript) is an optional nicety if you want to use it :)
 
what language? there should be some sort of better check that this, dont cc sites use some sort of checksum? dont know if its freely available or what.

the problem is, people can and will add spaces even if you dont want them too. that means you either need to build a better cehcker, or remove spaces as they are added.

maybe there are regular expressions out there for this kind of thing too?

oh and I dont think amercian express cards have 16 digits, are they supported?
 
There is indeed a CC validation method :)

Here's oscommerce's CC validation class:

Code:
<?php
/*
  $Id: cc_validation.php,v 1.3 2003/02/12 20:43:41 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/

  class cc_validation {
    var $cc_type, $cc_number, $cc_expiry_month, $cc_expiry_year;

    function validate($number, $expiry_m, $expiry_y) {
      $this->cc_number = ereg_replace('[^0-9]', '', $number);

      if (ereg('^4[0-9]{12}([0-9]{3})?$', $this->cc_number)) {
        $this->cc_type = 'Visa';
      } elseif (ereg('^5[1-5][0-9]{14}$', $this->cc_number)) {
        $this->cc_type = 'Master Card';
      } elseif (ereg('^3[47][0-9]{13}$', $this->cc_number)) {
        $this->cc_type = 'American Express';
      } elseif (ereg('^3(0[0-5]|[68][0-9])[0-9]{11}$', $this->cc_number)) {
        $this->cc_type = 'Diners Club';
      } elseif (ereg('^6011[0-9]{12}$', $this->cc_number)) {
        $this->cc_type = 'Discover';
      } elseif (ereg('^(3[0-9]{4}|2131|1800)[0-9]{11}$', $this->cc_number)) {
        $this->cc_type = 'JCB';
      } elseif (ereg('^5610[0-9]{12}$', $this->cc_number)) {
        $this->cc_type = 'Australian BankCard';
      } else {
        return -1;
      }

      if (is_numeric($expiry_m) && ($expiry_m > 0) && ($expiry_m < 13)) {
        $this->cc_expiry_month = $expiry_m;
      } else {
        return -2;
      }

      $current_year = date('Y');
      $expiry_y = substr($current_year, 0, 2) . $expiry_y;
      if (is_numeric($expiry_y) && ($expiry_y >= $current_year) && ($expiry_y <= ($current_year + 10))) {
        $this->cc_expiry_year = $expiry_y;
      } else {
        return -3;
      }

      if ($expiry_y == $current_year) {
        if ($expiry_m < date('n')) {
          return -4;
        }
      }

      return $this->is_valid();
    }

    function is_valid() {
      $cardNumber = strrev($this->cc_number);
      $numSum = 0;

      for ($i=0; $i<strlen($cardNumber); $i++) {
        $currentNum = substr($cardNumber, $i, 1);

// Double every second digit
        if ($i % 2 == 1) {
          $currentNum *= 2;
        }

// Add digits of 2-digit numbers together
        if ($currentNum > 9) {
          $firstNum = $currentNum % 10;
          $secondNum = ($currentNum - $firstNum) / 10;
          $currentNum = $firstNum + $secondNum;
        }

        $numSum += $currentNum;
      }

// If the total has no remainder it's OK
      return ($numSum % 10 == 0);
    }
  }
?>
 
I personally dislike osCommerce's code, tis now quite dated and well, just makes me go 'ick.'

Things like the need to have register_globals set to On, and long vars On put me off.

But.. it works, once you have fiddled with it long enough.
 
Back
Top Bottom