zoukankan      html  css  js  c++  java
  • 第 39 章 ThinkPHP--自动验证

    本节课,我们将要学习一下 ThinkPHP 模型层提供的一种数据验证方法,可以在使用 create 创建数据对象的时候进行自动验证。

    一.验证规则 数据验证可以对表单中的字段进行非法的验证操作。

    一般提供了两种验证方式:静态定 义($_validate 属性)和动态验证(validate()方法)。

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

    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 验证是否不在某个范围内,定义的验证规则可以是一个 数组或者逗号分割的字符串(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 全部情况下验证(默认)。 二.静态定义 在模型类里预先定义好该模型的自动验证规则,就是静态定义。 //模型类定义验证规则 class UserModel extends Model { protected $_validate = array( //默认情况下用系统内置 array('user', 'require', '用户不得为空!'), //验证数据唯一性 array('user', '', '用户名称已存在!',2,'unique',1), //验证密码不得为空 array('pass', 'require', '密码不得为空!'), //密码不得小于六位不得大于20位 array('pass', '6,20', '密码不得小于6位,不得大于20位', 3, 'length'), ); } 为了测试方便,我们可以直接通过模拟提交 POST: //控制器create()方法自动调用验证 $user = D('User'); $data['user'] = '蜡笔小新'; $data['pass'] = '123'; if ($user->create($data)) { echo '所有数据验证成功!'; } else { //输出错误信息 var_dump($user->getError()); } ThinkPHP 提供了九种自动验证内置方案,具体如下: //内置验证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', '不是纯英文!'), ThinkPHP 还提供了附加规则,来提升自动验证的扩展性: //附加规则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,某个范围,可以是数组或逗号分割的字符串 array('user', array(1,2,3), '不在指定范围', 0, 'in'), array('user', '张三,李四,王五', '不在指定范围', 0, 'in'), //附加规则notin,某个范围,可以是数组或逗号分割的字符串 array('user', array(1,2,3), '不得在指定范围', 0, 'notin'), array('user', '张三,李四,王五', '不得在指定范围', 0, 'notin'), //附加规则length,验证长度或数字范围 array('user', '3', '不得小于 3 位', 0, 'length'), array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'), //附加规则between,验证某个范围,数字或逗号字符串 array('user', array(3,5), '必须是 3-5 之间的数字', 0, 'between'), array('user', '3,5', '必须是 3-5 之间的数字', 0, 'between'), //附加规则notbetween,验证某个范围,数字或逗号字符串 array('user', array(3,5), '必须不是 3-5 之间的数字', 0, 'notbetween'), array('user', '3,5', '必须不是 3-5 之间的数字', 0, 'notbetween'), //附加规则expire,设置有效期范围,必须是表单提交有效,可以是时间戳 array('user', '2014-1-10,2015-10-10', '时间已过期', 0, 'expire'), //附加规则ip_deny,IP禁止列表 array('user', '127.0.0.1', '当钱 IP 被禁止', 0, 'ip_deny'), //附加规则ip_allow,IP允许列表 array('user', '127.0.0.1', '当前 IP 没有被允许', 0, 'ip_allow'),

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

    //回调方法 protected function checkLength($str,$min,$max) { preg_match_all("/./", $str, $matches); $len = count($matches[0]); if ($len < $min || $len > $max) { return false; } else { return true; } } //附加规则function,函数验证 array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'function', 3, array(3,5)), //在 Common 文件夹下的 Common 文件夹建立 function.php 文件,会自动加载 function checkLength($str,$min,$max) { preg_match_all("/./", $str, $matches); $len = count($matches[0]); if ($len < $min || $len > $max) { return false; } else { return true; } } 如果有多个字段都包含错误,默认只显示一个错误。如果想显示全部错误,可以设置属 性: //批量验证 protected $patchValidate = true; 如果是直接 POST 过来的,直接使用 create()方法即可。

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

    PS:由于使用的 UserModel 模型类,所以必须是 D()方法实例化。

    如果想把错误信息返回给ajax处理,可以是同ajaxReturn()方法返回JSON数据。

    //返回JSON格式 $this->ajaxReturn($user->getError());

    //1指定新增数据验证,2表示修改, if ($user->create($_POST,1)) {}

    //一般会自动判断 三.动态验证 动态验证就是把验证的规则放在控制器端,这样,在操作的时候比较灵活,缺点就是比 较混乱。

    //动态验证 $rule = array( array('user', 'require', '用户名不得为空'), ); $user = M('User'); $data['user'] = ''; if ($user->validate($rule)->create($data)) { echo '验证所有字段成功!'; } else { var_dump($user->geterror()); }

    我的个人博客,欢迎来访问!网址:http://www.miuu.club
  • 相关阅读:
    Maven常用命令
    SpringBoot实战(十三)之缓存
    python3对数据库的基本操作
    Microsoft visual c++ 14.0 is required问题
    python3之安装mysql问题
    如何将pip更新到最新版
    Java特性之继承的应用
    人人开源之代码生成器(renren-generator)
    《你凭什么做好互联网》之思维导图归纳
    GETOBJECTOPTIONS
  • 原文地址:https://www.cnblogs.com/yu520zhong/p/4855782.html
Copyright © 2011-2022 走看看