2011-11-05 43 views
0

我需要驗證一個表單。這是一些服務器端驗證,檢查是否填寫了必填字段,電子郵件是有效的,數字和字母數字字段不包含流氓字符。你會如何改進這個表單驗證代碼?

我想就如何提高代碼的可靠性和簡潔性提出一些反饋意見。

<?php 

// current state 
$valid = true; 

// post data collection 
$name = "John Doe"; 
$email = "[email protected]"; 
$age = "19"; 

// select data that needs validation 
$required = array($name, $email); 
$validEmail  = array($email); 
$validNumber = array($age); 
$validAlpha  = array($name); 

// check required fields 
for ($i=0; $i<count($required); $i++) { 
    if (strlen($required[$i]) == 0) { 
     echo "Please fill out all required fields"; 
     $valid = false; 
     break; 
    } 
} 

// check for valid email field 
for ($i=0; $i<count($validEmail); $i++) { 
    if (preg_match('/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/', $validEmail[$i])) { 

    } else { 
     echo '"' . $validEmail[$i] . '"' . ' is an invalid email address <br />'; 
     $valid = false; 
    } 
} 

// check numeric fields 
for ($i=0; $i<count($validNumber); $i++) { 
    if (preg_match('/^[0-9 ]+$/', $validNumber[$i])) { 

    } else { 
     echo '"' . $validNumber[$i] . '"' . ' is an invalid number <br />'; 
     $valid = false; 
    } 
} 

// check alpha 
for ($i=0; $i<count($validAlpha); $i++) { 
    if (preg_match('/^[a-zA-Z ]+$/', $validAlpha[$i])) { 

    } else { 
     echo '"' . $validAlpha[$i] . '"' . ' contains invalid characters. This field only accepts letters. <br />'; 
     $valid = false; 
    } 
} 

// return "Your form was successfully sent" 
if ($valid) { 
    echo 'Your form was successfully sent. <br />Back to the site <form><input type="button" value="back" onclick="history.go(-1);return true;"></form>'; 
} 

?> 
+5

使用符合標準的電子郵件正則表達式,例如內置'filter_var($ email,FILTER_VALIDATE_EMAIL)'。 – mario

回答

1

減少重複代碼通常可以以避免過濾器,用於驗證清單:

  • 迴路(學習foreach代替人工for計數)
  • 功能
  • 數組規則集

你的情況,你需要採用更好的輸入變量處理,即保持了名稱,使過濾這樣的:

$rules = array(
    "email" => FILTER_VALIDATE_EMAIL, 
    "number1" => '/^[0-9 ]+$/', 
    "alpha2" => '/^[a-zA-Z ]+$/',   
); 

foreach ($rules as $varname => $verify) { 
    if (is_int($verify) ? !filter_var($_REQUEST[$varname], $verify) 
         : !preg_match($verify, $_REQUEST[$varname])) 
    { 
     echo "The field '$varname' contains invalid whatevers..."; 
     $valid = false; 
    } 
} 

來自校驗規則,你也可以有自己的變量名的額外的間接當然,更好的錯誤信息。但這是這裏的基本方法。同樣,使用一些自定義函數進一步幫助可讀性和減少代碼。