自动验证[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 |
验证是否不等于某个值,该值由前面的验证规则定义 |
in |
验证是否在某个范围内,定义的验证规则可以是一个数 |
notin |
验证是否不在某个范围内,定义的验证规则可以是一个 |
length |
验证长度,定义的验证规则可以是一个数字(表示固定 |
between |
验证范围,定义的验证规则表示范围,可以使用字符串 |
notbetween |
验证不在某个范围,定义的验证规则表示范围,可以使 |
expire |
验证是否在有效期,定义的验证规则表示时间范围,可 |
ip_allow |
验证 IP 是否允许,定义的验证规则表示允许的 IP 地址 |
ip_deny |
验证 IP 是否禁止,定义的验证规则表示禁止的 ip 地址 |
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'),