一.验证规则

数据验证可以对表单中的字段进行非法的验证操作。一般提供了两种验证方式:

静态定 义($_validate 属性)和动态验证(validate()方法)。

//验证规则

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

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

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

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

验证规则:系统内置了常用的规则,require(字段必填)、email(邮箱格式)、url(url 格式)、currency(货币)、number(正整数)、integer(整数)、double(浮点数)、zip(邮 政编码)、english(英文)。

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

验证条件:共三种:

1.self::EXISTS_VALIDATE 或 0,表示存在字段就验证(默认);

2.self::MUST_VALIDATE 或 1,表示必须验证;

3.self::VALUE_VALIDATE 或 2,表示值不为空的时候验证。

这些规则默认采用的附加规则是 regex,正则表达式验证,只 不过是设定好的。

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

二.静态定义

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

//模型类定义验证规则
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());
}

Thinkphp 1.验证规则 2.静态定义 3.动态验证的更多相关文章

  1. EF里如何定制实体的验证规则和实现IObjectWithState接口进行验证以及多个实体的同时验证

    之前的Code First系列文章已经演示了如何使用Fluent API和Data Annotation的方式配置实体的属性,比如配置Destination类的Name属性长度不大于50等.本文介绍E ...

  2. SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码

    在SpringMVC学习系列(6) 之 数据验证中我们已经学习了如何结合Hibernate-validator进行后台的数据合法性验证,但是通常来说后台验证只是第二道保险,为了更好的用户体验会现在前端 ...

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

    1.静态定义 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 举例说明,我们在模型类里面定义了$_validate属性如下: class UserModel extends Model ...

  4. MVC验证05-自定义验证规则、验证2个属性值不等

    原文:MVC验证05-自定义验证规则.验证2个属性值不等 本文体验2个属性值不等.即当一个属性输入值,另外一个属性输入的值不能和第一个属性值相等.相关文章包括: MVC验证01-基础.远程验证   M ...

  5. Yii1.1的验证规则

    在Yii1.1的数据验证是由CValidator完成,在CValidator中提供了各种基本的验证规则 <?php public static $builtInValidators=array( ...

  6. 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单

    *$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...

  7. oracle ebs应用产品安全性-交叉验证规则

    转自: http://blog.itpub.net/298600/viewspace-625138/ 定义: Oracle键弹性域可以根据自定义键弹性域时所定义的规则,执行段值组合的自动交叉验证.使用 ...

  8. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  9. 把多种验证规则用到一个model上

    基于标记特性的Model验证,真的太棒了,与jquery validate结合后激情四射,有木有,一句话完成前后端验证.简直让人秒爱... 但是爱是爱了,生活中总会有些小摩擦,这不问题来了:看图中那个 ...

随机推荐

  1. WebService -- Java 实现之 CXF ( 使用CXF工具生成client 程序)

    1. 下载CXF 工具解压到磁盘 2.添加工具bin目录到PATH环境变量 3.创建一个CXF client新项目 4. run -> cmd 到指定目录,并运行工具目录下的批处理 “wadl2 ...

  2. sys/types.h fcntl.h unistd.h sys/stat.h

    sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型. 在应用程序源文件中包含 <sys/types.h> 以访问 ...

  3. python中如何避免中文是乱码

    这个问题是一个具有很强操作性的问题.我这里有一个经验总结,分享一下,供参考:首先,提倡使用utf-8编码方案,因为它跨平台不错.经验一:在开头声明: # -*- coding: utf-8 -*- 有 ...

  4. Odoo9是如何计算预定交付日期的

    计算预定日期目的是按计划交付.接收等.根据不同公司习惯,Odoo会通过调度器自动生成预定日期,Odoo调度器计算每一行的每件事情,无论是生产订单.交货单.销售订单等,依据Odoo中配置的不同交付时间( ...

  5. ajax提交form表单资料详细汇总

    一.ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单.通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新.这意味 ...

  6. 17. Letter Combinations of a Phone Number

    题目: Given a digit string, return all possible letter combinations that the number could represent. A ...

  7. asp.net ajax 调用后台方法

    js代码 <form id="form1" runat="server"> <script language=javascript type= ...

  8. git学习(三):版本控制

    查看每次修改日志 git log 会显示每次修改的日期和相应提交的commit 版本控制 git reset --hard <版本id> 这里的id可以是HEAD^(上一个) HEAD^^ ...

  9. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  10. Linux第01天

    Linux第01天 1.虚拟机安装linux(centos 32bit) 1.1 虚拟机安装前置工作的准备,如内存.硬盘.CPU分配.镜像下载等 1.2 安装方式(图形界面或者命令行 推荐图形界面即直 ...