ShopCMS 开发文档
HFramework 开发文档

7.6 数据格式验证

PHP数据验证,是在用户提交数据时必须要做的工作,任何情况下不要相信用户提交的任何内容。

框架提供的方法可以一次性验证一组数据,也可以单独有按照一个数据,框架的验证类位于 framework/extension/HValidate.php。

在HFramework框架中,只验证数据的格式,不有验证数据的类型,比如:'15' 和 15 在此类的验证中是等价的。
框架提供的验证类,您可以单独使用,但数据的验证一般在模型类中实现,在框架的模型基类中内置了验证方法(也是通过调用验证类实现),在您的模型类中,您调用验证方法,只要调用验证规则名即可,对应的验证类的验证方法一般是 is 前缀,比如验证是否为EMAIL,验证规则是 email,实际框架类的验证方法为 isEmail()方法。

框架的模型基类主要提供两个验证方法:test()方法和 testRule()方法,详情说明见模型基类的章节。

HFramework框架中提供了的的验证规则见下表:
规则名称 规则说明
email 验证方法为EMAIL
require 验证是否为不为空,不为空返回才能通过,字符串'0' 数字 0 均能通过
int 验证是否为整形
num 验证是否为数字 包括小数 和整数
money 验证是否为金额,必须为非负数,且最多两位小数
range 验证数字是否在范围内,需要传入扩展的参数 min、max,如果不传min表示最小值不限,如果不传max表示最大值不限
imgcode 验证图形验证码是否正确
注:被验证的图形验证码必须是框架的验证码类产生的验证码
url 验证网址是否正确 接受 http https开头的绝对网址,或者以“/”开头的相对网址,或者以#开头的锚点
datetime 验证是否为时间 格式为:Y-m-d H:i:s
date 验证是否为日期格式为:Y-m-d
mobile 验证是否为手机号
tel 验证是否为电话,区号、主机号、分机号用中划线“-”分隔,区号和主机号是必填的。如下面的格式均正确:021-99999999、021-99999999-1234
qq 验证是否为QQ号码,5-18位纯数字
length 验证字符串长度是否在允许的范围内,需要传入扩展的参数 min、max,如果不传min表示最小值不限,如果不传max表示最大值不限
in 验证数据是否在数据集中,扩展参数中需要有 set数组,用于比较 如 array('user1', 'user2')
username 判断是否为用户名,只验证字符串长度为5-32个字符,如果不符合您的规范,您可以重写此验证方法,或者对此参数单独验证
password 验证密码格式是否正确,限制:6-32位任意字符
reg 自定义的正则表达式验证,需要传入regexp扩展参数,见下面的示例。


示例1,验证是否是EMAIL:
<?php
/**
 * 用户模型类
 * CUser类继承自框架的模型基类(HModel)
 */
class User extends CUser{
	/**
	 * 会员注册
	 * @param array $params 用户注册信息  一维数组,格式为:
	 * array(
	 * 	'username'=>'user1',//用户名
	 * 	'password'=>'password1',//密码
	 * 	'img_code'=>'ABCD',//图形验证码
	 * )
	 * @return boolen 是否注册成功
	 */
	public function register($params){
		if(!$this->test($params['username'], 'email')){
			$this->addError('用户名只能为EMAIL');
			return false;
		}
		//.....其他的业务逻辑
	}
}
?>


示例2,带扩展参数的验证:
<?php
/**
 * 用户自定义模型类
 */
class Test extends HModel{
	/**
	 * 验证字符串长度
	 * @param $str 待测试的字符串
	 * @return void 无返回值
	 */
	public function test1($str){
		if(!$this->test($str, 'length', false, array('min'=>10, 'max'=>18))){
			$this->addError('请输入10-18位字符');
			return false;
		}
		//.....其他的业务逻辑
	}
}
?>


示例3,自定义的正则表达式验证:
<?php
/**
 * 用户自定义模型类
 */
class Test extends HModel{
	/**
	 * 验证字符串是否已A开头,并且允许字符串为空
	 * @param $str 待测试的字符串
	 * @return void 无返回值
	 */
	public function test2($str){
		if(!$this->test($str, 'ret', true, array('regexp'=>'/^A.*/'))){
			$this->addError('请输入以A开头的字符串');
			return false;
		}
		//.....其他的业务逻辑
	}
}
?>


上面的3个例子中可以看到,如果每验证一个数据,就要有1个if判断,如果需要验证的数据少是比较方便的,如果数据较多,验证比较繁琐,所以模型基类提供了批量验证的方法,见下面的示例。

示例4,批量验证:
<?php
/**
 * 自定义的用户模型类
 */
class User extends HModel{
	/**
	 * 会员注册
	 * @param array $params 用户注册信息  一维数组,格式为:
	 * array(
	 * 	'username'=>'user1',//用户名
	 * 	'password'=>'password1',//密码
	 * 	'img_code'=>'ABCD',//图形验证码
	 * )
	 * @return boolen 是否注册成功
	 */
	public function register($params){
		$rules = array(
			array('username,password', 'require', false, 'error'=>'用户名密码均不可为空'),//用户名密码不可为空
			array('username', 'length', false, 'min'=>5, 'max'=>32, 'error'=>'用户名长度只能限制在5-32位之间'),//用户名长度在5~32之间
			array('password', 'length', false, 'min'=>6, 'max'=>32, 'error'=>'密码长度只能限制在6-32位之间'),//密码长度在6~32之间
			array('img_code', 'imgcode', false, 'error'=>'图形验证码输入错误'),
		);
		if(!$this->testRule($params, $rules)){
			return false;
		}
		//.....其他的业务逻辑
	}
}
?>
在上述批量验证中,$rules的每一项都是一条规则数组:
1:规则数组中的第1项($rules[0]),表示待验证数组的键名,指明$params数组中的那些项目使用当前规则验证,多个键名用英文逗号分隔(不可有空格);
2:规则数组中的第2项($rules[1]),表示验证规则,全部规则见上表;
3:规则数组中的第3项($rules[2]),表示是否允许为空,如果允许为空,则空字符串也能通过验证;
4:规则数组中的error项($rules['error']),错误信息,当词条规则没有通过时,写入的错误信息,模型基类会调用addError()方法,把此处的错误信息写入对象以便获取;
5:其余的项目均视为扩展规则,如min项、max项。
6:多个规则中,如果有一个规则没有通过,则testRule方法均返回false,全部通过才返回true。
关键词:PHP数据验证 批量验证 验证规则 框架验证规则 验证方法
阅读:2958 | 发布时间:2019-01-04 09:59