ThinkPHP自动验证功能详解

作者:袖梨 2022-06-25

ThinkPHP自动验证

ThinkPHP内置了数据对象的自动验证功能来进行模型的业务规则验证。大多数情况下,数据是由表单提交的$_POST数据创建。则使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,它是由多个验证因子组成到得二维数组。

验证因子格式:

 代码如下 复制代码

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

实例(以注册时验证注册信息):

 代码如下 复制代码

class RegisterUser extends Model{
protected $_validate = array{
array('verify','require','验证码必须!'),    //默认情况下使用正则进行验证
array('name','','账号已存在!',0,'unique',1),    //在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'),    //当值不为空的时候判断是否在一个范围内
array('repassword','password','密码不一致!',0,'confirm'),    //验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确!',0,'function'),    //自定义函数验证密码格式
};
}

当使用create方法创建数据对象时会自动进行数据验证(当POST提交表单处理时):

 代码如下 复制代码

$Register = D("RegisterUser");
if(!$Register->create()){
//如果创建失败,表示验证没有通过
exit($Register->gerError());
}else{
//验证通过,继续下一步操作
}

通常,数据的验证规则都是相对固定,但有些特殊情况下需要使用其他验证条件,这时我们就需要动态的改变验证规则来满足不同条件。
方法是在模块中使用create方法之前使用setProperty方法,如下(还是以上面注册实例):

 代码如下 复制代码

$Register = D("RegisterUser");
$validate = array(
array('verify','require','验证码必须!'),    //仅仅需要验证验证码
);
$Register->setProperty("_validate",$validate);
if(!$Register->create()){
//如果创建失败,表示验证没有通过
exit($Register->gerError());
}else{
//验证通过,继续下一步操作
}

批量验证

新版支持数据的批量验证功能,只要在模型类里面设置patchValidate属性为true(默认为false),设置批处理验证后,getError()方法返回的错误信息是一个数组,返回格式是:

 代码如下 复制代码

array("字段名1"=>"错误提示1","字段名2"=>"错误提示2"...)

thinkphp自动验证无效的问题

Action方法: IndexAction下的adds方法,D(“Liuyan”)获取post提交过来的内容,create()方法创建数据对象,D方法创建了数据对象才可以自动调用验证。


 

 代码如下 复制代码
   public function adds(){
        $ly=D("liuyan");
        $result=$ly->create();
 
        if($result){
            echo 'success';
            $ly->add();
        }
        else{
            exit($ly->getError());
        }   
    }

Model方法:

自动验证功能,加上$_validate属性,以数组的形式定义验证规则。

 代码如下 复制代码

class LiuyanModel extends Model{
    protected $_validate=array(
        array('ly_content','require','名字必填哦!','1'),
        array('ly_user','','帐号名称已经存在!',0,'unique',1),
    );
}

这样写的问题是,新增数据没有问题,但是不能自动调用验证功能,ThinkPHP的验证功能失效了。弄了半天,才知道,原因在于D(“Liuyan”)这样写才是对的,首字母大写


自动验证失败及解决方法


Action 事件

 代码如下 复制代码

/*
 * 登陆
 */
public function Login(){
 if($_POST['submit']){
  $DB = D('Login');//自定义Model处理
      //if里面就是ThinkPHP的自动验证了.
  if(!$DB->create()){
   $this->redirect('Index/Login', '', 3, '错误信息: '.$DB->getError().'
系统将于3秒后返回重新登陆...');
  }else{
   $con['LoginName'] = $_POST['username'];
   $con['LoginPwd']  = md5($_POST['userpwd']);
   $list = $DB->where($con)->find();
   if(count($list)>0){
    echo 'ok';
   }else{
    $this->redirect('Index/Login', '', 3, '错误信息: 用户名或密码错误
系统将于3秒后返回重新登陆...');
   }
  }
  return ;
 }
 //这里只是将模板文件的地址封装了一下.
 A('Public')->ShowPage('login');    
}

Model

 代码如下 复制代码

class LoginModel extends Model {
 // 设置数据表
 protected $tableName = 'admin';
 // 自动验证设置
 protected $_validate = array(
  array('username','require','用户名必须!', 1),
  array('userpwd','require','密码必须!', 1),
 );
 /* 自动填充 如果不能自动验证,将这段代码取消注释看看.
 protected $_auto = array(
  array('status','1',self::MODEL_INSERT),
  array('create_time','time',self::MODEL_INSERT,'function'),
 );*/
 /*引用ThinkPHP2.0开发手册:ThinkPHP手册类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性
 */
 /*它这里说了,只需要在Model类里面定义$_validate属性,但是在使用ThinkPHP2.1的时候,的的确确不能通过验证,$DB->getError()无错误原因返回,且刷新的时候$DB->getError()返回"令牌表单错误"
 */
}
?>

相关文章

精彩推荐