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 代码优化的42条建议 推荐
Sep 25 PHP
php设计模式 Singleton(单例模式)
Jun 26 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
PHP的引用详解
Feb 22 PHP
PHP SOCKET编程详解
May 22 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
php微信公众号开发之简答题
Oct 20 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
flexigrid 参数说明
2010/11/23 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
js命名空间写法示例
2015/12/18 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
Python的time模块中的常用方法整理
2015/06/18 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
银行爱岗敬业演讲稿
2014/05/05 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL