今天在用thinkphp3.23时发现错误
NOTIC: [8] Undefined index: validate 此处是thinkphp核心目录ThinkModel.class.php 第 1185 行.
查看底层代码
/** * 自动表单验证 * @access protected * @param array $data 创建数据 * @param string $type 创建类型 * @return boolean */ protected function autoValidation($data,$type) { if(false === $this->options['validate'] ){ //问题位置 // 关闭自动验证 return true; }
将其改为
if(isset($this->options['validate']) && false === $this->options['validate'] ){
后未发现报错
最后查询各种资料和翻看tkinkphp的Model.class.php源码
原因如下:
// 链操作方法列表
protected $methods = array('strict','order','alias','having','group','lock','distinct','auto','filter','validate','result','token','index','force');
public function __call($method,$args) { if(in_array(strtolower($method),$this->methods,true)) { // 连贯操作的实现 $this->options[strtolower($method)] = $args[0]; return $this; }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ // 统计查询的实现 $field = isset($args[0])?$args[0]:'*'; return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method); }elseif(strtolower(substr($method,0,5))=='getby') { // 根据某个字段获取记录 $field = parse_name(substr($method,5)); $where[$field] = $args[0]; return $this->where($where)->find(); }elseif(strtolower(substr($method,0,10))=='getfieldby') { // 根据某个字段获取记录的某个值 $name = parse_name(substr($method,10)); $where[$name] =$args[0]; return $this->where($where)->getField($args[1]); }elseif(isset($this->_scope[$method])){// 命名范围的单独调用支持 return $this->scope($method,$args[0]); }else{ E(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); return; } }
当我们如下:
$this->shopModel =D('shop'); $data = $this->shopModel->validate(222)->create();
if(in_array(strtolower($method),$this->methods,true)) { // 连贯操作的实现 $this->options[strtolower($method)] = $args[0]; return $this;
触发这段
$this->options['validate']=222;
但是当我用模型的 protected $_validate时,而没有用动态验证时
$this->options['validate']是不存在的
那
if(false === $this->options['validate'] )就会出现
上面的报错。
同理在自动完成时也
NOTIC: [8] Undefined index: auto
是一样的原因
if(isset($this->options['auto']) && false === $this->options['auto']){
即可。