thinkphp自动验证笔记


1\验证规则

数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。

数据验证有两种方式:

  1. 静态方式:在模型类里面通过$_validate属性定义验证规则。
  2. 动态方式:使用模型类的validate方法动态创建自动验证规则。
  3. array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]))
验证字段 (必须)验证规则 (必须)提示信息 (必须)


protected  $_validate = array(
        
           /*
       
       
         array('user', 'require', '用户不得为空!'), //内置验证require,不得为空的用法
        
        array('user', 'email', '邮箱格式不合法!'),//内置验证email,合法的邮箱格式 
       
        array('user', 'url', 'URL 路径不合法!'), //内置验证url,验证网址是否合法 
     
        array('user', 'currency', '货币格式不正确!'),   //内置验证currency,验证是否为货币 
      
         array('user', 'zip', '邮政编码格式不正确!'),  //内置验证zip,验证是否为六位整数邮政编码
      
        array('user', number, '正整数格式不正确!'),  //内置验证number,验证是否为正整数 
     
         array('user', 'integer', '整数格式不正确!'),   //内置验证integer,验证是否为整数,正负均可
         
       array('user', 'double', '整数格式不正确!'),  //内置验证double,验证是否为浮点数,正负均可
       
        array('user', 'english', '不是纯英文!'), //内置验证english,验证是纯英文
        
       
        array('user', '/^\d{3,6}$/', '不是 3-6 位纯正数字', 0, 'regex'), //附加规则regex,验证3-6位纯数字
        array('user', '123', '值不对等', 0, 'equal'), //附加规则equal,验证是否和指定值相等
        array('user', '123', '值不能相等', 0, 'notequal'), //附加规则notequal,验证是否与指定值不等
        array('user', 'name', '两个用户名对比不同!',0,'confirm'),//附加规则confirm,验证两条字段是否相同 
        array('user', array(1,2,3), '不在指定范围', 0, 'in'), array('user', '张三,李四,王五', '不在指定范围', 0, 'in'), //附加规则in,某个范围,可以是数组或逗号分割的字符串
      
        array('user', array(1,2,3), '不得在指定范围', 0, 'notin'), array('user', '张三,李四,王五', '不得在指定范围', 0, 'notin'),  //附加规则notin,某个范围,可以是数组或逗号分割的字符串 
       
        array('user', '3', '不得小于 3 位', 0, 'length'), array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'), //附加规则length,验证长度或数字范围 
        
         array('user', array(3,5), '必须是 3-5 之间的数字', 0, 'between'), array('user', '3,5', '必须是 3-5 之间的数字', 0, 'between'),//附加规则between,验证某个范围,数字或逗号字符串
        
        array('user', array(3,5), '必须不是 3-5 之间的数字', 0, 'notbetween'), array('user', '3,5', '必须不是 3-5 之间的数字', 0, 'notbetween'),//附加规则notbetween,验证某个范围,数字或逗号字符串 
       
         array('user', '2014-1-10,2015-10-10', '时间已过期', 0, 'expire'), //附加规则expire,设置有效期范围,必须是表单提交有效,可以是时间戳
        */
        
       
       /* //附加规则callback,回调验证
         array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'callback', 3, array(3,5)),
    );
   
    //回调方法
     protected function checkLength($str,$min,$max) {
    preg_match_all("/./u", $str, $matches); $len = count($matches[0]);
     if ($len < $min || $len > $max) 
     { return false;
     
      } else
       { 
           return true;
        } }
*/
    //在 Common 文件夹下的 Common 文件夹建立 function.php 文件,会自动加载   
       array('user', 'checkLength', '用户名必须在 3-5 位', 0, 'function', 3, array(3,5)),);


}
    );
    
 public function add(){
      $user= D('User');
      //数组方式模拟提交
      $data['user']='123@qq.com';
      if ($user->create($data)){
          echo '所有字段验证成功';
          
      }else {
          var_dump($user->getError());
      }
function.php 文件,
  protected function checkLength($str,$min,$max) {
    preg_match_all("/./u", $str, $matches); $len = count($matches[0]);
     if ($len < $min || $len > $max) 
     { return false;
     
      } else
       { 
           return true;
        } }
*/


namespace Home\Model;
use Think\Model;
class UserModel 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方法创建数据对象的时候自动调用:

$User = D("User");

if (!$User->create()){

echo '验证所有字段成功!';

}else{

var_dump($user->geterror()); }

静态定义方式因为必须定义模型类,所以只能用D函数实例化模型

默认情况下,create方法是对表单提交的POST数据进行自动验证,数据来源不是表单post,仍然也可以进行自动验证,方法改进如下:

 
  1. $User = D("User");
  2. $data = getData(); // 通过getData方法获取数据源的(数组)数据
  3. if (!$User->create($data)){
  4. echo '验证所有字段成功!';
  5. }else{
  6. var_dump($user->geterror());
  7. }

一般情况下,create方法会自动判断当前是新增数据还是编辑数据(主要是通过表单的隐藏数据添加主键信息),你也可以明确指定当前创建的数据对象是新增还是编辑,例如:

 
  1. $User = D("User");
  2. if (!$User->create($_POST,1)){ // 指定新增数据
  3. echo '验证所有字段成功!';
  4. }else{
  5. var_dump($user->geterror());
  6. }

create方法的第二个参数就用于指定自动验证规则中的验证时间,也就是说create方法的自动验证只会验证符合验证时间的验证规则。

我们在上面提到这里的验证时间并非只有这几种情况,你可以根据业务需要增加其他的验证时间,例如,你可以给登录操作专门指定验证时间为4。我们定义验证规则如下:

 
  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $_validate = array(
  5. array('verify','require','验证码必须!'), // 都有时间都验证
  6. array('name','checkName','帐号错误!',1,'function',4), // 只在登录时候验证
  7. array('password','checkPwd','密码错误!',1,'function',4), // 只在登录时候验证
  8. );
  9. }

那么,我们就可以在登录的时候使用

$User = D("User");

if (!$User->create($_POST,4)){

//登录验证数据

echo '验证所有字段成功!';

}else{

$this->ajaxReturn($User->getError());}

2\动态验证

如果采用动态验证的方式,就比较灵活,可以根据不同的需要,在操作同一个模型的时候使用不同的验证规则,例如上面的静态验证方式可以改为:

$rules = array(
     array('user', 'require', '用户名不得为空'),
     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'), // 自定义函数验证密码格式
);
$User = M("User"); 
 $data['user']='';
if (!$User->validate($rules)->create()){
     echo '验证所有字段成功!'; 
}else{
     var_dump($user->geterror());
}
动态验证不依赖模型类的定义,直接在控制类操作,所以通常用M函数实例化模型就可以

3/错误信息多语言支持

多语言的错误信息提示,可以在验证规则里面如下定义:

protected $_validate = array(
     array('verify','require','{%VERIFY_CODE_MUST}'), 
     array('name','','{%ACCOUNT_EXISTS}',0,'unique',1), 
);

其中VERIFY_CODE_MUSTACCOUNT_EXISTS是我们在语言包里面定义的多语言变量。

采用动态验证方式,则比较简单,直接在定义验证规则的时候使用L方法即可,例如:

$rules = array(
     array('verify','require',L('VERIFY_CODE_MUST')), 
     array('name','',L('ACCOUNT_EXISTS'),0,'unique',1), 
);

4/批量验证

系统支持数据的批量验证功能,只需要在模型类里面设置patchValidate属性为true( 默认为false),

protected $patchValidate = true;

设置批处理验证后,getError() 方法返回的错误信息是一个数组,返回格式是:

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


前端可以根据需要需要自行处理,例如转换成json格式返回:

$User = D("User");

if (!$User->create()){

} echo '验证所有字段成功!';

else{

$this->ajaxReturn($User->getError());

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值