热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP3.1快速入门(12)自动验证

自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证。
自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证。

验证规则

数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。
数据验证有两种方式:
静态方式:在模型类里面通过$_validate属性定义验证规则。
动态方式:使用模型类的validate方法动态创建自动验证规则。
无论是什么方式,验证规则的定义是统一的规则,定义格式为:
  1. array(
  2.     array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),
  3.     array(验证字段2,验证规则,错误提示,[验证条件,附加规则,验证时间]),
  4.     ......
  5. );
说明
验证字段:(必须)需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等。有个别验证规则和字段无关的情况下,验证字段是可以随意设置的,例如expire有效期规则是和表单字段无关的。如果定义了字段映射的话,这里的验证字段名称应该是实际的数据表字段而不是表单字段。
验证规则:(必须)要进行验证的规则,需要结合附加规则,如果在使用正则验证的附加规则情况下,系统还内置了一些常用正则验证的规则,可以直接作为验证规则使用,包括:require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字。
提示信息:(必须)用于验证失败后的提示信息定义
验证条件:(可选)包含下面几种情况:
Model::EXISTS_VALIDATE 或者0 存在字段就验证(默认)
Model::MUST_VALIDATE 或者1 必须验证
Model::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 验证是否唯一,系统会根据字段目前的值查询数据库来判断是否存在相同的值。
验证时间:(可选)
Model::MODEL_INSERT或者1新增数据时候验证
Model::MODEL_UPDATE或者2编辑数据时候验证
Model::MODEL_BOTH或者3全部情况下验证(默认)
这里的验证时间需要注意,并非只有这三种情况,你可以根据业务需要增加其他的验证时间。

静态定义

在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义。
举例说明,我们在模型类里面定义了$_validate属性如下:
  1. class UserModel extends Model{
  2.   protected $_validate = array(
  3.     array('verify','require','验证码必须!'), //默认情况下用正则进行验证
  4.     array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
  5.     array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
  6.     array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
  7.     array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
  8.   );
  9. }
定义好验证规则后,就可以在使用create方法创建数据对象的时候自动调用:
  1. $User = D("User"); // 实例化User对象
  2. if (!$User->create()){
  3.     // 如果创建失败 表示验证没有通过 输出错误提示信息
  4.     exit($User->getError());
  5. }else{
  6.     // 验证通过 可以进行其他数据操作
  7. }
在进行自动验证的时候,系统会对定义好的验证规则进行依次验证。如果某一条验证规则没有通过,则会报错,getError方法返回的错误信息(字符串)就是对应字段的验证规则里面的错误提示信息。
默认情况下,create方法是对表单提交的POST数据进行自动验证,如果你的数据来源不是表单post,仍然也可以进行自动验证,方法改进如下:
  1. $User = D("User"); // 实例化User对象
  2. $data = getData(); // 通过getData方法获取数据源的(数组)数据
  3. if (!$User->create($data)){
  4.     // 对data数据进行验证
  5.     exit($User->getError());
  6. }else{
  7.     // 验证通过 可以进行其他数据操作
  8. }
一般情况下,create方法会自动判断当前是新增数据还是编辑数据(主要是通过表单的隐藏数据添加主键信息),你也可以明确指定当前创建的数据对象是新增还是编辑,例如:
  1. $User = D("User"); // 实例化User对象
  2. if (!$User->create($_POST,1)){ // 指定新增数据
  3.     // 如果创建失败 表示验证没有通过 输出错误提示信息
  4.     exit($User->getError());
  5. }else{
  6.     // 验证通过 可以进行其他数据操作
  7. }
create方法的第二个参数就用于指定自动验证规则中的验证时间,也就是说create方法的自动验证只会验证符合验证时间的验证规则。
我们在上面提到这里的验证时间并非只有这几种情况,你可以根据业务需要增加其他的验证时间,例如,你可以给登录操作专门指定验证时间为4。我们定义验证规则如下:
  1. class UserModel extends Model{
  2.   protected $_validate = array(
  3.     array('verify','require','验证码必须!'),  // 都有时间都验证
  4.     array('name','checkName','帐号错误!',1,'function',4),  // 只在登录时候验证
  5.     array('password','checkPwd','密码错误!',1,'function',4), // 只在登录时候验证
  6.   );
  7. }
那么,我们就可以在登录的时候使用
  1. $User = D("User"); // 实例化User对象
  2. if (!$User->create($_POST,4)){ // 登录验证数据
  3.     // 验证没有通过 输出错误提示信息
  4.     exit($User->getError());
  5. }else{
  6.     // 验证通过 执行登录操作
  7. }

动态验证

如果采用动态验证的方式,就比较灵活,可以根据不同的需要,在操作同一个模型的时候使用不同的验证规则,例如上面的静态验证方式可以改为:
  1. $rules = array(
  2.     array('verify','require','验证码必须!'), //默认情况下用正则进行验证
  3.     array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
  4.     array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
  5.     array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
  6.     array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式
  7. );
  8. $User = M("User"); // 实例化User对象
  9. if (!$User->validate($rules)->create()){
  10.     // 如果创建失败 表示验证没有通过 输出错误提示信息
  11.     exit($User->getError());
  12. }else{
  13.     // 验证通过 可以进行其他数据操作
  14. }

错误信息多语言支持

如果你希望支持多语言的错误信息提示,那么可以在验证规则里面如下定义:
  1. protected $_validate = array(
  2.     array('verify','require','{%VERIFY_CODE_MUST}'), 
  3.     array('name','','{%ACCOUNT_EXISTS}',0,'unique',1), 
  4. );
其中VERIFY_CODE_MUST和ACCOUNT_EXISTS是我们在语言包里面定义的多语言变量。
如果是采用动态验证方式,则比较简单,直接在定义验证规则的时候使用L方法即可,例如:
  1. $rules = array(
  2.     array('verify','require',L('VERIFY_CODE_MUST')), 
  3.     array('name','',L('ACCOUNT_EXISTS'),0,'unique',1), 
  4. );

批量验证

系统支持数据的批量验证功能,只需要在模型类里面设置patchValidate属性为true( 默认为false),
  1. protected $patchValidate = true;
设置批处理验证后,getError() 方法返回的错误信息是一个数组,返回格式是:
  1. array("字段名1"=>"错误提示1","字段名2"=>"错误提示2"... )
前端可以根据需要需要自行处理,例如转换成json格式返回:
  1. $User = D("User"); // 实例化User对象
  2. if (!$User->create()){
  3.     // 如果创建失败 表示验证没有通过 输出错误提示信息
  4.     $this->ajaxReturn($User->getError());
  5. }else{
  6.     // 验证通过 可以进行其他数据操作
  7. }

推荐阅读
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • 解决fetch上传图片至微信公众号H5页面的问题
    在近期的一个项目需求中,需要在微信公众号内嵌入H5页面,并实现用户通过该页面上传图片的功能,包括拍摄新照片或从已有相册中选择。前端开发中采用了fetch API进行接口调用,但遇到了上传图片时数据无法正确传递的问题。 ... [详细]
  • 本文详细介绍了如何手动编写兼容IE的Ajax函数,以及探讨了跨域请求的实现方法和原理,包括JSONP和服务器端设置HTTP头部等技术。 ... [详细]
  • 本文基于https://major.io/2014/05/13/coreos-vs-project-atomic-a-review/的内容,对CoreOS和Atomic两个操作系统进行了详细的对比,涵盖部署、管理和安全性等多个方面。 ... [详细]
  • [TOC]Process的几个用法和守护进程一、Process的join用法话不多说,直接上代码二、Process的pid和ppid用法需要先导入os模块站在当前进程的角度:os. ... [详细]
  • 2023年PHP处理请求超时的全面指南
    本文详细介绍了在PHP中处理请求超时的各种方法,包括设置脚本执行时间、处理file_get_contents函数超时以及优化AJAX请求等,适合开发者参考学习。 ... [详细]
  • django项目中使用手机号登录
    本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数function.py文件se ... [详细]
  • 解决phpMyAdmin运行错误:mysqli_init(): 属性访问尚未允许
    本文探讨了在使用phpMyAdmin过程中遇到的mysqli_init()函数错误,并提供了有效的解决方案。 ... [详细]
  • 致信息安全爱好者的成长指南
    本文旨在为信息安全爱好者提供一份详尽的成长指南,涵盖从学习心态调整到具体技能提升的各个方面。 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 解析程序员与软件工程师的角色差异
    本文深入探讨了程序员与软件工程师之间的主要区别,包括它们的职业定位、技能要求以及工作内容等方面的不同,旨在帮助读者更好地理解这两个角色的特点。 ... [详细]
  • 微信小程序配置详解:pages、window、tabBar与调试模式
    本文详细介绍了如何在微信小程序中配置pages、window、tabBar以及启用调试模式,帮助开发者更好地理解和应用这些配置选项。 ... [详细]
  • 本文介绍了在处理财务凭证查询时,如何实现从插入或修改页面返回至原始查询结果页面,并确保数据保持最新状态的方法。通过使用JavaScript和Java的Session管理技术,解决了动态页面中AJAX调用失效的问题。 ... [详细]
  • 本文详细介绍了如何在JavaScript中使用jQuery库进行AJAX异步请求,包括请求的基本配置和处理流程。同时,探讨了阿里巴巴的FastJSON库在JSON数据解析中的应用,并简要介绍了Highcharts图表插件的使用方法。 ... [详细]
  • 本文探讨了如何利用 Application 对象在 PHP 应用程序中共享数据,特别是在多用户环境中保持数据的一致性和安全性。文章还介绍了 Application 对象的基本结构、方法和事件,并提供了实际应用示例。 ... [详细]
author-avatar
mobiledu2502858723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有