• 自动验证[1]


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

    //验证规则

    1 array(
    2 array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    3 array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
    4 ......
    5 );

    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 函数验证,定义的验证规则是一个函数名
    规则 说明
    regex  正则验证,定义的验证规则是一个正则表达式(默认)
    function 函数验证,定义的验证规则是一个函数名
    callback  方法验证,定义的验证规则是当前模型类的一个方法
    confirm

    验证表单中的两个字段是否相同,定义的验证规则是一
    个字段名

    equal 验证是否等于某个值,该值由前面的验证规则定义
    notequal

    验证是否不等于某个值,该值由前面的验证规则定义
    (3.1.2版本新增)

    in

    验证是否在某个范围内,定义的验证规则可以是一个数
    组或者逗号分割的字符串

    notin

    验证是否不在某个范围内,定义的验证规则可以是一个
    数组或者逗号分割的字符串(3.1.2版本新增)

    length

    验证长度,定义的验证规则可以是一个数字(表示固定
    长度)或者数字范围(例如3,12 表示长度从3到12的范
    围)

    between

    验证范围,定义的验证规则表示范围,可以使用字符串
    或者数组,例如1,31或者 array(1,31)

    notbetween

    验证不在某个范围,定义的验证规则表示范围,可以使
    用字符串或者数组(3.1.2版本新增)

    expire

    验证是否在有效期,定义的验证规则表示时间范围,可
    以到时间,例如可以使用 2012-1-15,2013-1-15 表示
    当前提交有效期在2012-1-15到2013-1-15之间,也可
    以使用时间戳定义

     ip_allow  

    验证 IP 是否允许,定义的验证规则表示允许的 IP 地址
    列表,用逗号分隔,例如201.12.2.5,201.12.2.6

     ip_deny  

    验证 IP 是否禁止,定义的验证规则表示禁止的 ip 地址
    列表,用逗号分隔,例如201.12.2.5,201.12.2.6

     unique  

    验证是否唯一,系统会根据字段目前的值查询数据库来
    判断是否存在相同的值,当表单数据中包含主键字段时
    unique 不可用于判断主键字段本身

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

    1.self::MODEL_INSERT 或 1 新增数据时验证;
    2.self::MODEL_UPDATE 或 2 编辑数据时验证;
    3.self::MODEL_BOTH 或 3 全部情况下验证(默认)。

    二. 静态定义

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

    在 Home/controller/UserController.class.php 插入以下代码:

     1 //控制器create()方法自动调用验证
     2 $user = D('User');
     3 $data['user'] = '蜡笔小新'; 4   if ($user->create($data)) {
     5 echo '所有数据验证成功!';
     6 } else {
     7 //输出错误信息
     8 var_dump($user->getError());
    9 }

    这时,在 Home/Model/UserModel.class.php 插入以下检测的代码:

     1 <?php
     2 namespace HomeModel;
     3 use ThinkModel;
     4 
     5 class UserModel extends Model {
     6     protected $_validate= array(
     7         array('user','require','用户名不得为空',0,'regex',3),
     8         );
     9 }

     array('user', 'require', '用户不得为空!'),   内置验证require,不得为空的用法,这时就会去验证 $data['user'] = '蜡笔小新'; 这个数值,如果$data['user']为空的话,就会

    var_dump()出'用户不的为空'这条语句

    需要注意的是 rray('user', 'require', '用户不得为空!'), 里的user是和 Home/controller/UserController.class.php  中 $data['user'] = '蜡笔小新'; 里的user是必须相同的

    要不然就不能验证了。

    ThinkPHP 提供了九种自动验证内置方案,具体如下:

    1 //内置验证require,不得为空的用法
    2 array('user', 'require', '用户不得为空!'),
    1 //内置验证email,合法的邮箱格式
    2 array('user', 'email', '邮箱格式不合法!'),
    1 //内置验证email,合法的邮箱格式,而且必须要有http://   但是我试了,发现没有www是可行的
    2 array('user', 'email', '邮箱格式不合法!'),
    1 //内置验证url,验证网址是否合法
    2 array('user', 'url', 'URL 路径不合法!'),
    1 //内置验证currency,验证是否为货币
    2 array('user', 'currency', '货币格式不正确!'),
    1 //内置验证zip,验证是否为六位整数邮政编码
    2 array('user', 'zip', '邮政编码格式不正确!'),
    1 //内置验证number,验证是否为正整数
    2 array('user', number, '正整数格式不正确!'),
    1 //内置验证integer,验证是否为整数,正负均可
    2 array('user', 'integer', '整数格式不正确!'),
    1 //内置验证double,验证是否为浮点数,正负均可
    2 array('user', 'double', '整数格式不正确!'),
    1 //内置验证english,验证是纯英文
    2 array('user', 'english', '不是纯英文!'),

    ThinkPHP 还提供了附加规则,来提升自动验证的扩展性:

    1 //附加规则regex,验证3-6位纯数字
    2 array('user', '/^d{3,6}$/', '不是 3-6 位纯正数字', 0, 'regex'),
    1 //附加规则equal,验证是否和指定值相等
    2 array('user', '张三', '值不对等', 0, 'equal'),
    1 //附加规则notequal,验证是否与指定值不等
    2 array('user', '张三', '值不能相等', 0, 'notequal'),
    1 //附加规则confirm,验证两条字段是否相同
    2 array('user', 'name', '两个用户名对比不同!',0,'confirm'),

    这时在 Home/controller/UserController.class.php  这应该要有$data['user']和$data['name']这两个参数,要不然就没有对比的了。

    可以用在用户注册时,password和repassword,这样就能验证用户输入的密码是确定的。

    1 //附加规则in,某个范围,可以是数组或逗号分割的字符串
    2 array('user',  array(1,2,3), '不在指定范围', 0, 'in'),
    3 array('user', '张三,李四,王五', '不在指定范围', 0, 'in'),
    1 //附加规则notin,某个范围,可以是数组或逗号分割的字符串
    2 array('user',  array(1,2,3), '不得在指定范围', 0, 'notin'),
    3 array('user', '张三,李四,王五', '不得在指定范围', 0, 'notin'),
    1 //附加规则length,验证长度或数字范围
    2 array('user', '3', '不得小于 3 位', 0, 'length'),
    3 array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'),
    1 //附加规则between,验证某个范围,数字或逗号字符串
    2 array('user',  array(3,5), '必须是 3-5 之间的数字', 0, 'between'),
    3 array('user', '3,5', '必须是 3-5 之间的数字', 0, 'between'),
    1 //附加规则notbetween,验证某个范围,数字或逗号字符串
    2 array('user',  array(3,5), '必须不是 3-5 之间的数字', 0, 'notbetween'),
    3 array('user', '3,5', '必须不是 3-5 之间的数字', 0, 'notbetween'),
  • 相关阅读:
    [NOI Online 提高组]序列
    微积分(下)
    微积分(上)
    [FJOI2018]领导集团问题
    [HNOI2015]亚瑟王
    [THUWC2017]随机二分图
    【模板】K级祖先(长链剖分)
    [CF438E]The Child and Binary Tree
    [洛谷P4841][集训队作业2013]城市规划
    [洛谷P4389]付公主的背包
  • 原文地址:https://www.cnblogs.com/jacson/p/4500732.html
Copyright © 2020-2023  润新知