<?php
/****************
* verify.class.php
* 表单验证类
*****************/
class Verify{
private $params;
public function __construct($input=array()){
$this->init($input);
}
/*
* @function 初始化参数
* @param array $input表单域名数组 示例array("userName","pwd")
* @return
*/
public function init($input=array()){
$this->params=$input;
}
/**
* @function 检测所有提交数据是否通过验证
* @param array $input 二维数组 示例: array(array("name"=> ,"value"=>,"type"=>,"format"=>,"allow_arr"=>,"maxLength"=>,"mixLength"=>,"isEmpty"=>),)
* @return boolean true|false
*/
public function checkAll($input){
if(is_array($input)){
$flag=true;
foreach($input as $key=>$value){
if(!isset($this->params[$value["name"]])){
continue;
}
$value["allow_arr"]=(isset($value["allow_arr"]) && is_array($value["allow_arr"])) ? $value["allow_arr"] : array();
$value["maxLength"]=isset($value["maxLength"]) ? $value["maxLength"] : 0;
$value["mixLength"]=isset($value["mixLength"]) ? $value["mixLength"] : 0;
$value["isEmpty"]=isset($value["isEmpty"]) ? $value["isEmpty"] : 0;
$result=$this->inputCheck($value["name"],$value["value"],$value["type"],$value["format"],$value["allow_arr"],$value["maxLength"],$value["mixLength"],$value["isEmpty"]);
if($result===false){
$flag=false;
echo "表单域名称为".$value["name"]."的值".$value["value"]."未通过验证";
break;
}
}
return $flag;
}
}
/*
* @function 输入参数验证是否通过
* @params string $name 表单名
* mixed $value 表单名对应的值
* string $type 变量类型 必须是基础数据类型int,bool,double,string。
* string $format 数据格式类型 email,pwd等
* array $allow_arr 允许范围
* int $maxLength 最大长度
* int $mixLength 最小长度
* int $isEmpty 是否允许为空
* @return boolean true|false
*/
public function inputCheck($name,$value,$type,$format,$allow_arr=array(),$maxLength=0,$mixLength=0,$isEmpty=0){
//检查变量是否存在
if(!isset($this->params[$name])){
return false;
}
//第二步 判断变量是否有值
if(empty($value)){
if($isEmpty==0){
return false;
}
else{
return true;
}
}
//第三步 判断变量类型是否
if($this->getParameterType($value)!==$type){
return false;
}
//第四步 如果是字符串判断其是否在指定长度内
if(is_string($value) && (strlen(trim($value))<$mixLength || strlen(trim($value))>$maxLength)){
return false;
}
//第四步 如果是选择项即allow_arr数组不为空,是否在数组范围内
if(!empty($allow_arr) && !in_array($value,$allow_arr)){
return false;
}
//第五步 进入正则表达式验证
return $this->matchValue($value,$format);
}
/*
* @function 获得参数的数据类型
* @params mixed $value参数
* @return string $var_type数据类型
*/
public function getParameterType($value){
$var_type="";
if(is_int($value)){
$var_type="int";
}
else if(is_bool($value)){
$var_type="bool";
}
else if(is_double($value)){
$var_type="double";
}
else if(is_string($value)){
$var_type="string";
}
else{
$var_type="unkown";
}
return $var_type;
}
/*
* @function 使用正则表达式检验值
* @params mixed $value参数,string $format数据格式类型
* @return boolean true|false
*/
public function matchValue($value,$format){
switch($format){
case "integer"://整数
return is_int($value);
break;
case "account"://账号
//由字母a~z(不区分大小写)、数字0~9、下划线组成只能以字母开头和(数字或字母)结尾 用户名长度为8~18个字符
return preg_match("/^[a-za-z]{1}[a-za-z0-9|_]{6-16}[a-za-z0-9]{1}$/",$value);
break;
case "password"://密码
//由字母a~z(不区分大小写)、数字0~9、下划线组成只能以字母开头和(数字或字母)结尾 用户名长度为6~14个字符
return preg_match("/^[a-zA-Z]{1}[a-za-z0-9|_]{4-12}[a-za-z0-9]{1}$/",$value);
default:
break;
}
}
}
//测试代码
$cols=array("account");
$verify=new Verify($cols);
$inputCheck=array();
$inputCheck[]=array("name"=>"account","value"=>$account,"type"=>"string","format"=>"account","maxLength"=>18,"mixLength"=>8);
$rs=$verify->checkAll($inputCheck);
?>本人菜鸟一个,写了一个简单的表单验证类,各位大大及老师帮我看看,还有哪些不足或遗漏的地方,希望指出,谢谢!
自己纠正一下一个逻辑错误,第四步 如果是字符串判断其是否在指定长度内时
修改前
if(is_string($value) && (strlen(trim($value))<$mixLength || strlen(trim($value))>$maxLength)){
return false;
}修改后
if(is_string($value)){
if(strlen(trim($value))<$mixLength || strlen(trim($value))>$maxLength){
return false;
}
}