thinkphp 三大自动验证
2013-04-25 10:41
363 查看
public function create($data='',$type='') { // 如果没有传值默认取POST数据 if(empty($data)) { $data = $_POST; }elseif(is_object($data)){ $data = get_object_vars($data); } // 验证数据 if(empty($data) || !is_array($data)) { $this->error = L('_DATA_TYPE_INVALID_'); return false; } // 检查字段映射 $data = $this->parseFieldsMap($data,0); // 状态 $type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT); // 检测提交字段的合法性 if(isset($this->options['field'])) { // $this->field('field1,field2...')->create() $fields = $this->options['field']; unset($this->options['field']); }elseif($type == self::MODEL_INSERT && isset($this->insertFields)) { $fields = $this->insertFields; }elseif($type == self::MODEL_UPDATE && isset($this->updateFields)) { $fields = $this->updateFields; } if(isset($fields)) { if(is_string($fields)) { $fields = explode(',',$fields); } // 判断令牌验证字段 if(C('TOKEN_ON')) $fields[] = C('TOKEN_NAME'); foreach ($data as $key=>$val){ if(!in_array($key,$fields)) { unset($data[$key]); } } } // 数据自动验证 if(!$this->autoValidation($data,$type)) return false; // 表单令牌验证 if(C('TOKEN_ON') && !$this->autoCheckToken($data)) { $this->error = L('_TOKEN_ERROR_'); return false; } // 验证完成生成数据对象 if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据 $fields = $this->getDbFields(); foreach ($data as $key=>$val){ if(!in_array($key,$fields)) { unset($data[$key]); }elseif(MAGIC_QUOTES_GPC && is_string($val)){ $data[$key] = stripslashes($val); } } } // 创建完成对数据进行自动处理 $this->autoOperation($data,$type); // 赋值当前数据对象 $this->data = $data; // 返回创建的数据以供其他调用 return $data; } // 自动表单令牌验证 // TODO ajax无刷新多次提交暂不能满足 public function autoCheckToken($data) { if(C('TOKEN_ON')){ $name = C('TOKEN_NAME'); if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效 return false; } // 令牌验证 list($key,$value) = explode('_',$data[$name]); if($value && $_SESSION[$name][$key] === $value) { // 防止重复提交 unset($_SESSION[$name][$key]); // 验证完成销毁session return true; } // 开启TOKEN重置 if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]); return false; } return true; }
ThinkPHP 自动验证 字段映射 自动完成
create方法将上述的三个功能整合到了一起,也就是说,任何一个验证出现差错,都不能返回希望得到的$data(可能是部分字段的数据)首先自动验证是针对表单字段的,验证的条件包括
Model::EXISTS_VALIDATE 或者0 表单中存在需要验证的字段就验证 (默认)
Model::MUST_VALIDATE 或者1 必须验证 不管表单是否有设置该字段 (尚未发现何时能用到该项,比较奇怪)
Model::VALUE_VALIDATE或者2 表单中字段值不为空的时候验证
这里分这么几种情况
1 验证字段中($_validate)存在该字段验证信息,如array("username","require","用户名必须",0),而表单中也存在一个字段(如username),此事即默认情况, 表单中存在需要验证的字段,验证通过后存入模型的$data成员属性中,验证失败则不存入,$data直接设置为false,错误信息写入模型的$error成员属性中,方便程序员后续的查询。
2 验证字段中($_validate)不存在该字段验证信息,而验证字段中($_validate)不存在该字段验证信息,那么不验证,直接存到$data中
3 验证字段中($_validate)不存在该字段验证信息,而验证的条件Model::MUST_VALIDATE 或 1, 那么不管表单中又没有该字段(即为空),都验证。
4 验证字段中($_validate)存在该字段验证信息,Model::VALUE_VALIDATE或者2, 表单中字段值不为空的时候验证。
当然如果数据库中没有表单中的字段,返回的$data数据也会过滤掉相应的字段。
if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据 53 $fields = $this->getDbFields(); 54 foreach ($data as $key=>$val){ 55 if(!in_array($key,$fields)) { 56 unset($data[$key]); 57 }elseif(MAGIC_QUOTES_GPC && is_string($val)){ 58 $data[$key] = stripslashes($val); 59 } 60 } 61 }
未完待续
相关文章推荐
- ThinkPHP三大自动之 自动验证
- ThinkPHP学习笔记(十)在Model中完成自动验证前台的表单数据
- ThinkPHP三大自动
- ThinkPHP 自动验证与自动填充无效可能的原因
- ThinkPHP框架项目开发专题--自动验证
- ThinkPHP中的create方法与自动令牌验证实例教程
- ThinkPHP Model类自动验证功能解析
- ThinkPHP 表单自动验证运用
- ThinkPHP框架项目开发专题--自动验证
- ThinkPHP中的create方法与自动令牌验证
- ThinkPHP的自动验证摘记
- ThinkPHP自动验证
- 简单的thinkphp自动验证使用
- Thinkphp3.2自动验证和自动完成无效
- thinkPHP自动验证机制详解
- ThinkPHP 自动验证及验证规则详解!
- Thinkphp自动验证规则
- THINKPHP自动验证,自动完成,字段…
- Thinkphp 登录以及注册的自动验证
- ThinkPHP - 自动创建 + 自动验证 + 自动完成