第 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()); }

时间: 2024-11-03 01:22:17

第 39 章 ThinkPHP--自动验证的相关文章

ThinkPHP 自动验证与自动填充无效可能的原因

原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关. create 方法语法如下: c

thinkphp自动验证无效的问题

新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds方法,D(“Liuyan”)获取post提交过来的内容,create()方法创建数据对象,D方法创建了数据对象才可以自动调用验证. public function adds(){ $ly=D("liuyan"); $result=$ly->create(); if($result){

&lt;转&gt;thinkphp自动验证无效的问题

新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds方法,D(“Liuyan”)获取post提交过来的内容,create()方法创建数据对象,D方法创建了数据对象才可以自动调用验证. public function adds(){ $ly=D("liuyan"); $result=$ly->create(); if($result){

thinkphp自动验证

1.thinkphp的自动验证 自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 1.1应用范围: 进行数据类型.业务规则.安全判断等方面的验证. 1.2验证方式: 1.静态方式:在模型类里面通过$_validate属性定义验证规则. 2.动态方式:使用模型类的validate方法动态创建自动验证规则. 1.3验证规则: 例:一个简单的注册信息时的自动验证: <?php namespace Home\Model; use Thin

thinkphp自动验证和自动完成

tp验证码的自动验证小案例 模板文件 <form action="" method="post"> <p> User: <input type="text" name="name1" id=""> </p> <p> PASS: <input type="password" name="pass1" id

Thinkphp自动验证规则

其实说白了,这篇文章就是转给自己看的,省的下次用的时候满网络找了.有需要的同学也可以看看.自动验证是非常有用的一个技术.平常的验证基本就是,用户名是否为空,用户名是否重复,密码,重复密码是否一致.官方给的就是这些.那么我们不可能只用到这些,铁定还有别的规则,所以下面这些规则供同学借鉴,也供我自己借鉴. array(‘name’,’/^[a-z]\w{3,}$/i’,’名字不符合要求!’);array(‘password’,’/^[a-z]\w{6,30}$/i’,’密码不符合要求!’);arra

thinkphp自动验证中的静态验证和动态验证和批量验证

1.静态定义 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 举例说明,我们在模型类里面定义了$_validate属性如下: class UserModel extends Model{ protected $_validate = array( array('verify','require','验证码必须!'), //默认情况下用正则进行验证 array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一 ar

ThinkPHP自动验证分析

今天一起来学习下TP的自动验证具体是怎么实现的,首先验证规则的定义格式如下: // 验证因子定义格式 array(field,rule,message,condition,type,when,params) field:验证字段的名称 rule:验证表达式 message:错误信息 condition:验证条件,0存在就验证 1 必须验证 2值不为空时验证 type:验证方式 when:什么时候验证 1插入时 2 更新时 3两种情况都验证 params:额外参数,当验证规则类型为function

thinkphp自动验证方法的使用

建一个表单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="{:U('Index/check')}" method='post'> <table>