thinkphp自动验证BUG问题

来源:互联网 发布:淘宝买手机没有发票 编辑:程序博客网 时间:2024/04/27 17:26

近日使用TP3.1版本的自动验证发现有BUG,主要表现为:自动验证update编辑更新的时候如果唯一字段没有变化也会报数据库重复错误提示


    /*
        最后第六个参数比较诡异 
        填1的时候,ADD验证SAVE都验证
        填2的时候,ADD和SAVE都不进去验证
        填3的时候,ADD验证SAVE都验证
        
        create验证的时候第二个参数传递self::MODEL_UPDATE或者2时,
        填1时,add验证save不验证,
        填2时,add不验证save验证,
        填3时,add验证save验证,
        
        create验证的时候第二个参数传递self::MODEL_INSERT或者1时,
        填1时,add验证save验证,
        填2时,add不验证save不验证,
        填3时,add验证save验证,
        
        create验证的时候第二个参数传递self::MODEL_BOTH或者3时,
        填1时,add不验证save不验证,
        填2时,add不验证save不验证,
        填3时,add验证save验证,

这些数据怎么来的可以参考核心代码Model.class.php中autoValidation方法的 if(empty($val[5]) || $val[5]== self::MODEL_BOTH || $val[5]== $type )这个判断,在918行左右。

$val[5]就是你传递进去的自动验证的第6个参数,$type就是create时传递进去的第二个参数如果不传他会自己判断判断方法可参考create方法的$type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT);在749行左右。
    */

平时的写法却在只需要更新数据时自动验证的时候自动验证不验证的例子:

    protected $_validate = array(


        array('user_name', 'checkupdate', '该账号已关联嘉宾,一个账号只能关联一个嘉宾资料', 0,'callback',2),
    );

//验证编辑
    protected function checkupdate($data){
        $id=trim($_POST['id']);
        if($this->where("id!=".$id." and user_name='".trim($data)."'")->find()){
            return false;
        }else{
            return true;
        }
    }

//编辑执行

public function update(){

$data['user_name']=trim($_POST['user_name']);
        $data['pen_name']=trim($_POST['pen_name']);
        $data['price']=trim($_POST['price']);
        $data['guests_jj']=trim($_POST['guests_jj']);
        $data['guests_info']=trim($_POST['guests_info']);
        $data['status']=1;
        $data['createtime']=time();

        if( $this->create( $data ) ) {
            return $this->where('id='.$_POST['id'])->save();
        } else {
            return $this->getError();
        }
    }



正确使用的例子,这样写后只会在更新的时候验证:

    protected $_validate = array(


        array('user_name', 'checkupdate', '该账号已关联嘉宾,一个账号只能关联一个嘉宾资料', 0,'callback',2),
    );

//验证编辑
    protected function checkupdate($data){
        $id=trim($_POST['id']);
        if($this->where("id!=".$id." and user_name='".trim($data)."'")->find()){
            return false;
        }else{
            return true;
        }
    }

//编辑执行

public function update(){

$data['user_name']=trim($_POST['user_name']);
        $data['pen_name']=trim($_POST['pen_name']);
        $data['price']=trim($_POST['price']);
        $data['guests_jj']=trim($_POST['guests_jj']);
        $data['guests_info']=trim($_POST['guests_info']);
        $data['status']=1;
        $data['createtime']=time();
//此处紫色部分可用self :: MODEL_UPDATE或者2
        if( $this->create( $data , self :: MODEL_UPDATE) ) {
            return $this->where('id='.$_POST['id'])->save();
        } else {
            return $this->getError();
        }
    }


PS:造成这个BUG的原因是因为我们的数据$data中没有主键字段的存在,create是根据$data中的字段来判断是添加操作还是更新操作的,如果有主键字段他会认为是更新验证,没有主键字段就认为是添加验证。所以$data数组中有主键字段的就可以在create时不传第二个参数,上面自动验证第六个参数直接填2就可以达到所要的效果了


0 0
原创粉丝点击