程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 簡單編寫php驗證類,教你如何寫好php程序(含多種驗證規則)

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

編輯:關於PHP編程

很多人在開發網站的時候往往只是通過簡單的js驗證,當你一不小心在js中多寫了個逗號或者點號,ie6無法識別就直接跳過驗證了。其實最安全的做法還是需要在服務端對用戶輸入的數據做驗證的。本人寫了個簡單的php驗證類,含多種驗證規則,供大家學習參考。原文鏈接


[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]+@([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
/**
 * 用戶輸入規則驗證類
 * 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]+@([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] 
<?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
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]
<?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; 
        } 
    } 

<?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;
  }
 }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved