簡單編寫php驗證類,教你如何寫好php程式(含多種驗證規則)
阿新 • • 發佈:2019-01-04
很多人在開發網站的時候往往只是通過簡單的js驗證,當你一不小心在js中多寫了個逗號或者點號,ie6無法識別就直接跳過驗證了。其實最安全的做法還是需要在服務端對使用者輸入的資料做驗證的。本人寫了個簡單的php驗證類,含多種驗證規則,供大家學習參考。原文連結
<?php /** * 使用者輸入規則驗證類 * author HaiNing Zhang * date 2013-05-23 */ class Validate{ // 驗證規則 private $role_name = array( // 驗證是否為空 'required', // 匹配郵箱 'email', // 匹配身份證 'idcode', // 匹配數字 'number', // 匹配http地址 'http', // 匹配qq號 'qq', //匹配中國郵政編碼 'postcode', //匹配ip地址 'ip', //匹配電話格式 'telephone', // 匹配手機格式 'mobile', //匹配26個英文字母 'en_word', // 匹配只有中文 'cn_word', // 驗證賬戶(字母開頭,由字母數字下劃線組成,4-20位元組) 'user_account', ); /** * [驗證函式] * @param [array] $data [使用者要驗證的資料] * @param [array] $validate_role [驗證規則] * @param [array] $validate_err_msg [錯誤資訊提示] * @return [bool] [成功返回true, 失敗返回錯誤資訊] */ public function verify($data, $validate_role, $validate_err_msg=''){ if(empty($data)) return false; if(empty($validate_role)) return false; foreach ($data as $key => $value) { $key = strtolower($key); foreach ($validate_role as $kk => $vv) { $kk = strtolower($kk); if($key == $kk){ foreach ($vv as $k => $v) { $k = strtolower($k); if( !in_array($k, $this->role_name)) return 'role name "'.$k.'" is not found!'; if($v == true){ if ( !$this->$k($value) ){ if (!isset($validate_err_msg[$kk][$k])) return 'var '.$key.' in '.$k.' of regular validation failure!'; return $validate_err_msg[$kk][$k]; } } } } } } return true; } // 獲取規則陣列 public function get_role_name(){ return $this->role_name; } // 設定屬性規則 public function set_role_name($arr){ $this->role_name = array_merge($this->role_name, $arr); } // 驗證是否為空 public function required($str){ if(trim($str) != "") return true; return false; } // 驗證郵件格式 public function email($str){ if(preg_match("/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]
[email protected]([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/", $str)) return true; else return false; } // 驗證身份證 public function idcode($str){ if(preg_match("/^\d{14}(\d{1}|\d{4}|(\d{3}[xX]))$/", $str)) return true; else return false; } // 驗證http地址 public function http($str){ if(preg_match("/[a-zA-Z]+:\/\/[^\s]*/", $str)) return true; else return false; } //匹配QQ號(QQ號從10000開始) public function qq($str){ if(preg_match("/^[1-9][0-9]{4,}$/", $str)) return true; else return false; } //匹配中國郵政編碼 public function postcode($str){ if(preg_match("/^[1-9]\d{5}$/", $str)) return true; else return false; } //匹配ip地址 public function ip($str){ if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $str)) return true; else return false; } // 匹配電話格式 public function telephone($str){ if(preg_match("/^\d{3}-\d{8}$|^\d{4}-\d{7}$/", $str)) return true; else return false; } // 匹配手機格式 public function mobile($str){ if(preg_match("/^(13[0-9]|15[0-9]|18[0-9])\d{8}$/", $str)) return true; else return false; } // 匹配26個英文字母 public function en_word($str){ if(preg_match("/^[A-Za-z]+$/", $str)) return true; else return false; } // 匹配只有中文 public function cn_word($str){ if(preg_match("/^[\x80-\xff]+$/", $str)) return true; else return false; } // 驗證賬戶(字母開頭,由字母數字下劃線組成,4-20位元組) public function user_account($str){ if(preg_match("/^[a-zA-Z][a-zA-Z0-9_]{3,19}$/", $str)) return true; else return false; } // 驗證數字 public function number($str){ if(preg_match("/^[0-9]+$/", $str)) return true; else return false; } }
呼叫方法
<?php require('model/Validate.php'); $data = array( "username"=>'[email protected]', "qq"=>'593084029', "nickname"=>'張海寧', "id"=>'24', ); $validate_role = array( 'username'=>array( 'required'=>true, 'email'=>true, ), 'qq'=>array( 'required'=>true, 'qq'=>true, ), 'nickname'=>array( 'required'=>true, ), 'id'=>array( 'required'=>true, 'number'=>true, ), ); $validate_err_msg = array( 'username'=>array( 'required'=>"使用者名稱不能為空", 'email'=>"郵箱格式不正確", ), 'qq'=>array( 'required'=>"qq不能為空", 'qq'=>"qq格式不正確", ), 'nickname'=>array( 'required'=>"暱稱不能為空", ), 'id'=>array( 'required'=>"id不能為空", 'number'=>"不是數字", ), ); $Validate = new Validate(); $rt = $Validate->verify($data, $validate_role, $validate_err_msg); if ($rt !== true){ echo $rt; exit; }
當然,如果你覺得驗證無法滿足你的需求,您還可以建立子類擴充套件您的方法
<?php
/**
* 使用者資料庫非同步驗證
* author HaiNing Zhang
* date 2013-05-23
*/
class AjaxValidate extends Validate{
private $role_name = array(
// 驗證使用者名稱是否存在
'is_username',
// 驗證暱稱是否存在
'is_nickname',
);
private $db;
public function __construct(){
$this->db = &load_system("Database");
$this->set_role_name($this->role_name);
}
// 判斷使用者名稱是否可以註冊(防止使用者名稱重複)
public function is_username($username){
$_username = $this->db->filter('s', $username);
$sql = "select id from user where username =".$_username;
if($this->db->num_rows($sql)){
return false;
}else{
return true;
}
}
// 判斷暱稱是否可用(防止暱稱重複)
public function is_nickname($nickname){
$_nickname = $this->db->filter('s', $nickname);
$sql = "select id from user where nickname =".$_nickname;
if($this->db->num_rows($sql)){
return false;
}else{
return true;
}
}
}