自动验证

一、验证规则

1、验证规则

数据验证可以对表单中的字段进行非法验证操作。一般提供了两种验证方式:静态定义($_validate属性)和动态验证(validate()方法)。

//验证规则
array{
    array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    ......
}

PS:验证字段、验证规则和错误提示这三项是必选的,大多数也是用这三项;而验证条件、附加规则和验证时间是可选的。

验证字段:一般来说是表单的字段名,不一定必须和数据表匹配,因为有一些比如密码确认等辅助字段的存在。

验证规则:系统内置了常用的规则,require(字段必填)、email(邮箱格式)、url(url格式)、currency(货币)、number(正整数)、integer(整数)、double(浮点数)、zip(邮政编码)、english(英文)。这些规则都默认采用的附加规则是regex,正则表达式验证,只不过是设定好的。

错误提示:验证失败后的提示。

验证条件:共三种:

1)self::EXISTS_VALIDATE或0,表示存在字段就验证(默认)(就是数据提交过来了才进行验证);
2)self::MUST_VALIDATE或1,表示必须验证(不论有没有字段都需要验证);
3)self::VALUE_VALIDATE或2,表示值不为空的时候验证(就比如邮箱,可填可不填的情况下,填了就验证合法性,没填就直接略过)。

附加规则:配合验证规则使用,包括以下规则:

规则 说明
regex 正则验证,定义的验证规则是一个正则表达式(默认)
function 函数验证,定义的验证规则是一个函数名
callback 方法验证,定义的验证规则是当前模型类的一个方法
confirm 验证表单中的两个字段是否相同,定义的验证规则是一个字段名
equal 验证是否等于某个值,该值由前面的验证规则定义
notequal 验证是否不等于某个值,该值由前面的验证规则定义(3.1.2版本新增)
in 验证是否在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串
notin 验证是否不在某个范围内,定义的验证规则可以是一个数组或者逗号分割的字符串
length 验证长度,定义的验证规则可以是一个数字(表示固定长度)或者数字范围(例如3,12表示长度从3到12的范围)
between 验证范围,定义的验证规则表示范围,可以使用字符串或者数组,例如1,31或者array(1,31)
notbetween 验证不在某个范围,定义的验证规则表示范围,可以使用字符串或者数组
expire 验证是否在有效期,定义的验证规则表示时间范围,可以到时间,例如可用2018-1-15,2019-1-15表示当前提交有效期在2018-1-15到2019-1-15之间,也可以使用时间戳定义
ip_allow 验证IP是否允许,定义的验证规则表示允许的IP地址列表,用逗号分隔,例如201.12.2.5,201.12.2.6
ip_deny 验证IP是否禁止,定义的验证规则表示禁止的IP地址列表,可用逗号分隔,如192.168.1.1,192.168.1.100
unique 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值;当表单数据中包含主键字段时unique不可用于判断主键字段本身

验证时间:主要新增修改等验证。

1)self::MODEL_INSERT或1表示新增数据时验证;
2)self::MODEL_UPDATE或2表示标记数据时验证;
3)self::MODEL_BOTH或3表示全部情况下验证(默认)。

2、静态定义

在模型类里预先定义好该模型的自动验证规则,就是静态定义。

//模型类定义验证规则
<?php
namespace Home\Model;
Use Think\Model;

class UserModel extends Model{
    protected $_validate = array(

        //分别对应上面的部分,user为字段,require为验证规则,然后是错误提示,验证条件,附加规则,验证时间
        array('user','require','用户名不得为空',0,'regex',3),
        array(),
    );
}
?>

为了测试方便,我们直接通过模拟提交POST。

//控制器create()方法自动调用验证
$user = D('User');
$data['user'] = '某某人';
$data['pass'] = '123';
if($user->create($data)){
    echo '所有数据验证成功';
}else{
    //输出错误信息
    var_dump($user->getError());
}

TP框架提供了9种自动验证内置方案,具体如下:

//内置验证require,非空检测
array('user','require','用户名不得为空');
//内置验证email,邮箱格式合法性检测
array('user','email','邮箱格式不合法');
//内置验证URL,网址合法性检测
array('user','url','URL路径不合法');
//内置验证currency,货币格式检测
array('user','currency','货币格式不正确');
//内置zip,邮编格式检测
array('user','zip','邮政编码格式不正确');
//内置验证number,正整数检测
array('user','number','非正整数');
//内置验证integer,整数验证,正负均可
array('user','integer','整数格式不正确');
//内置验证double,验证是否为浮点数
array('user','double','必须是浮点数');
//内置验证english,纯英文检测
array('user','english','不是纯英文');

TP框架还提供了附加规则,来提示自动验证的扩展性:

//附加规则regex,验证3-6位纯数字
array('user','/^d{3,6}$/','不是3-6位纯数字','0','regex');
//附加规则equal,验证是否和指定值相等
array('user','某某某','值不对等','0','equal');
//附加规则notequal,验证是否与指定值不等
array('user','某某某','值不能对等','0','notequal');
//附加规则confirm,验证两条字段是否相同
//也可用于密码和重复密码验证
array('user','name','两个用户名对比不同','0','confirm');
//附加规则in,某个范围,可以是数组或逗号分隔的字符串
//与之对应的是notin
array('user',array(1,2,3),'不在指定范围','0','in');
array('user','张三,李四,王五','不在指定范围','0','in');
//附加规则length,验证长度或数字范围
array('user','3','不得小于3位','0','length');
array('user','3,5','不得小于3位,不得大于5位','0','length');
//附加规则between,验证某个范围,数字或逗号字符串
//与之对应的是notbetween
array('user',array(3,5,),'必须是3-5之间的数字','0','between');
array('user','3,5','必须是3-5之间的数字','0','between');
//附加规则expire,设置有效时间范围,必须是通过表单提交才有效,可以是时间戳
array('user','2017-1-1,2018-1-1','时间已过期','0','expire');
//附加规则ip_deny,IP禁止访问列表
//与之对应的是ip_allow    ----IP允许
array('user','127.0.0.1','当前IP禁止','0','ip_deny');

上面是已经定义好的,如果系统未定义的就是通过其他方法如:

//附加规则callback,回调验证
array('user','checklength','用户名必须在3-5位','0','callback',3,array(3,5));

//回调方法
protected function checklength($str,$min,$max){
    preg_match_all("/./u",$str,$matches);
    $len = count($matches[0]);
    if($len<$min||$len>$max){
        return false;
    }else{
    return ture;
    }
}
//另一种是附加规则function,函数验证
array('user','checklength','用户名必须在3-5位','0','function',3,array(3,5));

//在Common文件夹下的Common文件夹建立function.php文件,会自动加载
function checklength($str,$min,$max){
    preg_match_all("/./u",$str,$matches);
    $len = count($matches[0]);
    if($len<$min||$len>$max){
        return false;
    }else{
    return ture;
    }
}

如果有多个字段都包含错误,默认只显示一个错误。
当想显示全部错误的时候,可以说盒子属性

//批量验证
protected $patchValidate = true;

如果是直接POST过来的,直接用create()方法即可。

//控制器create()方法自动调用验证
$user = D('User');

猜你喜欢

转载自blog.csdn.net/qq_36432666/article/details/80833186