2010-05-17 9 views
1

양식 제출에서 데이터 유효성 검사를 효과적으로 처리하는 방법은 무엇입니까?효과적인 데이터 유효성 검사

원래 각 값을 검사하고 나중에 검색 (및 나열)을 위해 배열에 잘못된 값을 수집 한 if 문장이있었습니다.

// Store errors here 
$errors = array(); 

// Hypothetical check if a string is alphanumeric 
if (!preg_match('/^[a-z\d]+$/i', $fieldvalue)) 
{ 
    $errors[$fieldname] = 'Please only use letters and numbers for your street address'; 
} 

// etc... 

내가 다음에 수행 한 작업은 다양한 데이터 유효성 검증 시나리오를 처리하고 결과를 내부 배열에 저장하는 클래스를 만드는 것입니다. 데이터 유효성 검사를 완료 한 후 나는 어떤 오류가 발생했는지 확인하고 그에 따라 처리 할 것 :

class Validation 
{ 
    private $errorList = array(); 

    public function isAlphaNumeric($string, $field, $msg = '') 
    { 
     if (!preg_match('/^[a-z\d]+$/i', $string)) 
     { 
      $this->errorList[$field] = $msg; 
     } 
    } 

    // more methods here 

    public function creditCard($cardNumber, $field, $msg = '') 
    { 
     // Validate credit card number 
    } 

    // more methods here 

    public function hasErrors() 
    { 
     return count($this->errorList); 
    } 
} 

/* Client code */ 

$validate = new Validation(); 
$validate->isAlphaNumeric($fieldvalue1, $fieldname1, 'Please only use letters and numbers for your street address'); 
$validate->creditCard($fieldvalue2, $fieldname2, 'Please enter a valid credit card number'); 

if ($validate->hasErrors()) 
{ 
    // Handle as appropriate 
} 

는 당연히이 클래스의 유효성을 검사 할 데이터의 무제한 종류 부풀어되었다 오래 전에하지 않았다. 내가 지금하고 있어요 자신의 클래스로 데이터의 다른 유형을 분리하고 일반적인 검증을 떠나 필요한 경우에만 그들을 호출하는 장식을 사용 (예 : isAlphaNumeric()) 기본 클래스 :

class Validation 
{ 
    private $errorList = array(); 

    public function isAlphaNumeric($string, $field, $msg = '') 
    { 
     if (!preg_match('/^[a-z\d]+$/i', $string)) 
     { 
      $this->errorList[$field] = $msg; 
     } 
    } 

    // more generic methods here 

    public function setError($field, $msg = '') 
    { 
     $this->errorList[$field] = $msg; 
    } 

    public function hasErrors() 
    { 
     return count($this->errorList); 
    } 
} 

class ValidationCreditCard 
{ 
    protected $validate; 

    public function __construct(Validation $validate) 
    { 
     $this->validate = $validate; 
    } 

    public function creditCard($cardNumber, $field, $msg = '') 
    { 
     // Do validation 
     // ... 
     // if there is an error 
     $this->validate->setError($field, $msg); 
    } 

    // more methods here 
} 

/* Client code */ 

$validate = new Validation(); 
$validate->isAlphaNumeric($fieldvalue, $fieldname, 'Please only use letters and numbers for your street address'); 

$validateCC = new ValidationCreditCard($validate); 
$validateCC->creditCard($fieldvalue2, $fieldname2, 'Please enter a valid credit card number'); 

if ($validate->hasErrors()) 
{ 
    // Handle as appropriate 
} 

내가 오전 바른 길? 아니면 필자는 필자가 필요로하는 것 이상으로 데이터 검증을 복잡하게 만들었습니까?

+0

:

도에서 참조하시기 바랍니다. 나는 또한이 Ques의 대답을 얻는 것에 흥미가있을 것이다. Currenlty는 또한 양식을 확인합니다. 내가 가능한 TryParse 및 다른 inbuild 함수를 사용합니다. 남은 것은 나 자신을 만든다. –

답변

2

무엇이든지, 당신은 충분히 유효하지 않습니다.

  • 그것 (array_key_exists)
  • 이 있는지 여부를 확인, UTF-8을 기대
  • 경우가 배열인지 확인 여부를하려면 존재 여부를 확인하려면 독서 $ _POST 데이터와 $ _GET 위해 당신은 적어도 필요 그런 다음 그런데 필드

의 유형에 특정 유효성 검사를 할

  • 유효한 UTF-8합니다 ('유'수정이 옵션으로는 preg_match), PHP에서 검증 및 위생을 할 수있는 현재의 엉덩이 방법을 사용하는 것입니다..

    <?php 
    $data = array(
        "arg1good" => "sdgdf790", 
        "arg1bad" => "sdgdf7/90", 
        "arg1bad2" => array("sdgdf90", "sfdssf"), 
        "arg2good" => "4567576456", 
        "arg2bad" => "45675764561", 
    ); 
    
    $validateCredCard = function ($cc) { 
        if (preg_match('/^\\d{10}$/', $cc)) 
         return $cc; 
        else 
         return false; 
    }; 
    
    $arg1filt = array('filter' => FILTER_VALIDATE_REGEXP, 
            'flags' => FILTER_REQUIRE_SCALAR, 
            'options' => array('regexp' => '/^[a-z\d]+$/i'), 
           ); 
    $arg2filt = array('filter' => FILTER_CALLBACK, 
            'flags' => FILTER_REQUIRE_SCALAR, 
            'options' => $validateCredCard, 
           ); 
    $args = array(
        "arg1good" => $arg1filt, 
        "arg1bad" => $arg1filt, 
        "arg1bad2" => $arg1filt, 
        "arg2good" => $arg2filt, 
        "arg2bad" => $arg2filt, 
    ); 
    
    var_dump(filter_var_array($data, $args)); 
    

    가 제공합니다 : - 성능 당신은 당신의 목적이 무엇인지에 대해 매우 명확하지 않는 것

    array(5) { 
        ["arg1good"]=> 
        string(8) "sdgdf790" 
        ["arg1bad"]=> 
        bool(false) 
        ["arg1bad2"]=> 
        bool(false) 
        ["arg2good"]=> 
        string(10) "4567576456" 
        ["arg2bad"]=> 
        bool(false) 
    } 
    
  • 0

    이것은 지나치게 복잡합니다.

    숫자 데이터 : 단지 $ _POST 값을

    $val=(int)$_POST["val"]; 
    

    이메일 캐스트 : (올바른 하나를 찾을 수 있도록 노력하겠습니다) 그렇게 미리 만들어진 기능이 있습니다.

    $email=check_email($_POST["email"]) or die("Ha!"); 
    

    이름과 주소 : 그것은 낯선 사람이 당신에 대해 생각하지 않았다 및 함수에 의해 필터링되는 유니 코드 문자를 입력 하루를 올 것이다 이후에는 아무 것도 할 필요가 없습니다.

    전화 번호 : 아무 것도하지 않습니다. 허위 번호를주고 싶다면 그는 그렇게 할 것입니다.

    포스트 코드와 같은 특수 코드 : 일반적으로 매우 엄격한 표준을 따르고 그 중 하나를 사용하여 필터하는 함수를 작성하면 완료됩니다.

    1

    특정 경우에는 여기에서 예입니다?새로운 코드의 단순성? 전반적인 유지 보수 가능성?

    물론 성능상의 이유로 데이터로 정규 표현식 (및 임계 값 및 ....)을 저장하는 대신 유효성 검사를 코드로 유지하는 것이 좋습니다. 문제는 데이터 항목을 적절한 유효성 검사에 매핑하는 방법 인 것 같습니다. 정적 인 맵을 배열로 설정할 수는 있지만 양식을 렌더링하고 데이터베이스 열로 매핑하기 위해 데이터 구조에 대해 알아야하기 때문에 코드 내에서보다 공식적인 메타 데이터 관리 방법을 구현하는 것이 좋습니다. .

    C.

    0

    Lo'oris 값을 캐스팅하는 것은 완전히 완료되지 않습니다에 대한 귀하의 대답 @. 다음 예를 고려하십시오 :이 예제가 보여주는 것처럼 당신은 변수가 정수로 기대한다면이 전략은 작동

    $val_1 = (int)null; // $val_1 equals 0 
    $val_2 = (int)false; // $val_2 equals 0 
    $val_3 = (int)'';  // $val_3 equals 0 
    $val_4 = (int)array(); // $val_4 equals 0 
    

    을 "check_email의 관점에서 또한 큰 0보다

    "함수 - 인터넷에서 찾을 수있는 많은 구현이 있지만 그 중 대부분은 불완전하거나 올바르지 않습니다.

    "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$" 
    

    하거나 하나 :

    "^[a-zA-Z0-9_.-][email protected][a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$" 
    

    모두 그 정규 표현식에 다음과 같은 이메일 주소 거부 :

    Abc\@[email protected] 
    customer/[email protected] 
    !def!xyz%[email protected] 
    

    구현의 대부분은 이와 같은 정규식 표현을 사용 모두 유효 (에 따름). 나는 또한 당신이 마지막에 설명 된 동일한 방법을 사용 http://www.regular-expressions.info/email.html

    +0

    캐스팅에 대한 귀하의 의견을 이해하지 못합니다. 예, 잘못된 값은 0으로 캐스팅됩니다 ... 저에게 좋습니다! ">"와 같이 더 엄격한 무언가가 필요하다면 단지 설명해야 할 이국적인 것이 아닙니다 ... –

    관련 문제