1. 程式人生 > >簡單編寫php驗證類,教你如何寫好php程式(含多種驗證規則)

簡單編寫php驗證類,教你如何寫好php程式(含多種驗證規則)

很多人在開發網站的時候往往只是通過簡單的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;
		}
	}
}