ThinkPHP中create()方法自动验证表单信息


Posted in PHP onApril 28, 2017

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

原理:

create()方法收集表单($_POST)信息并返回,同时触发表单自动验证,过滤非法字段,

在控制器中使用create()方法,(返回值为true/false),会自动触发模型类中的$_validate属性(为父类Model中的方法,在子类Model中重写),在$_validate中自定义验证规则(验证规则下面会详细说明),当create()方法没有数据即返回值为false时,通过$xxx对象->getError();获取并返回错误信息!

使用自动验证必须按照以下规则格式定义:

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

其中验证字段,验证规则,错误提示是必填项,验证条件,附加规则,验证时间为可选!

验证字段(必填):表单字段。

验证规则(必填):require 字段必须、email 邮箱、url URL地址、number 数字,还可以结合附加规则使用。

错误提示(必填):验证失败时返回的提示信息。

验证条件(可选):有0,1,2三种,0:_POST中存在的字段验证,默认;1:验证规则定义了就必须验证;2:值不为空时验证.

附加规则:

ThinkPHP中create()方法自动验证表单信息

验证时间(可选):共有1,2,3三种,1:新增数据时候验证;2:编辑数据时候验证;3:全部情况下验证(默认);也可以可以根据业务需要增加其他的验证时间

下面附上代码:以注册为例

前台页面比较简单,代码就不贴出来了,下面是前台注册界面截图

ThinkPHP中create()方法自动验证表单信息

控制器代码:

//注册
 public function register(){
  $user = new \Model\UserModel();

  //两个逻辑:收集,展示
  if (!empty($_POST)) {
  
  //create()方法收集表单($_POST)信息并返回,同时触发表单自动验证,过滤非法字段
  $date = $user->create();
  //通过create()方法的返回值$date判断验证是否成功
  if ($date) { //返回实在数据的时候才进行添加
   //implode()把数组变为字符串
   $date['user_hobby'] = implode(',', $date['user_hobby']);
   $info = $user->add($date);
   if ($info) {
   
   //跳转首页   
   $this->redirect('Index/index');
   }
  }else{

   //把错误信息分配到前台模板
   $error = $user->getError();
   $this->assign('error',$error);
  }
  }
  //调用view视图
  $this->display();
 }

模型类代码:

class UserModel extends Model{
 
 //是否批量处理验证,批量获取全部的错误验证信息
 protected $patchValidate = true; //默认为false

 //自动验证定义
 protected $_validate = array(

  //array(字段,验证规则,错误提示,验证条件,附加规则,验证时间)
  //①用户名验证,不能为空
  array('username','require','用户名不能为空'),
  array('username','','该用户名已经被占用','0','unique'),
  //②密码验证,不为空
  array('password','require','密码不能为空'),
  //③验证确认密码,必须填写,与密码保持一致
  array('password2','require','确认密码必须填写'),
  array('password2','password','两次密码保持一致',0,'confirm'),
  //④邮箱验证
  array('user_email','email','邮箱格式不正确',2),
  //⑤qq验证,数字组成,5-12位
  array('user_qq','number','qq必须是数字'),
  array('user_qq','5,12','位数在5-12位之间',0,'length'),
  //⑥学历验证,必须选一个
  array('user_xueli','2,5','学位必须选择一个',0,'between'),
  //⑦爱好验证,必须选择二个以上
  //因为爱好返回的是数组,附加规则中没有可以直接用的规则,所以需自定义方法,用callback方法验证
  array('user_hobby','check_hobby','爱好必须选两项或以上',1,'callback'),
  );

 //定义方法进行爱好验证
 //参数$arg代表被验证的表单信息
 function check_hobby($arg)
 {
  //判断数组长度是否大于2
  if (count($arg)<2) {
   return false; //会自动输出验证错误信息
  }
  return true;
 }
}

把验证的错误信息在模板中给展示出来(部分代码)

<td style="width:13%; text-align: right;">
 <label for="User_username" class="required">用户名 
 <span>*</span></label>
</td>

<td style="width:87%;">
 <input class="inputBg" size="25" name="username" id="User_username" type="text" value="" />     
 <span style="color:red;"><{$error.username|default:""}></span>
</td>

结果:

ThinkPHP中create()方法自动验证表单信息

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP has encountered an Access Violation
Jan 15 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
php实现水印文字和缩略图的方法示例
Dec 29 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 PHP
ThinkPHP实现简单登陆功能
Apr 28 #PHP
ThinkPHP实现分页功能
Apr 28 #PHP
ThinkPHP实现附件上传功能
Apr 27 #PHP
使用ThinkPHP生成缩略图及显示
Apr 27 #PHP
php实现头像上传预览功能
Apr 27 #PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 #PHP
phpMyAdmin无法登陆的解决方法
Apr 27 #PHP
You might like
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
对联广告js flash激活
2006/10/19 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python 自定义装饰器实例详解
2019/07/20 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
python复合条件下的字典排序
2020/12/18 Python
精选干货:Java精选笔试题附答案
2014/01/18 面试题
教师评语大全
2014/04/28 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
起诉意见书范文
2015/05/19 职场文书
英雄儿女观后感
2015/06/09 职场文书
心得体会格式及范文
2016/01/25 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis