tp3.2

phpxxo發表於2020-12-06

1. where查詢條件in , not in 陣列為空形成sql錯誤

例: 下面的$tagids 為空時,生成的sql將成 select * from tag where id in () , 導致sql報錯

$where = ['id'=>['in',$tagids];
$list=M('tag')
->where($where)
->select();

解決方案:

第一種方法: 先判斷in 的條件陣列是不是空, 不為空才有該條件

程式碼示例:

$query=M('tag');
if($tagids){
	$query->where(['id'=>['in',$tagids]]);
}

$list = $query->select();

第二種方法: 修改tp框架底層

在框架檔案 在Common/ThinkPHP/Library/Think/Db/Driver.class.phpparseWhereItem方法裡找到下面的程式碼

}elseif(preg_match('/^(notin|not in|in)$/',$exp)){ // IN 運算
    if(isset($val[2]) && 'exp'==$val[2]) {
        $whereStr .= $key.' '.$this->exp[$exp].' '.$val[1];
    }else{
        if(is_string($val[1])) {
             $val[1] =  explode(',',$val[1]);
        }
        $zone      =   implode(',',$this->parseValue($val[1]));
        $whereStr .= $key.' '.$this->exp[$exp].' ('.$zone.')';
    }

然後修改成下面

}elseif(preg_match('/^(notin|not in|in)$/',$exp)){ // IN 運算
    if(isset($val[2]) && 'exp'==$val[2]) {
        $whereStr .= $key.' '.$this->exp[$exp].' '.$val[1];
    }else{
        if(is_string($val[1])) {
             $val[1] =  explode(',',$val[1]);
        }
        $zone      =   implode(',',$this->parseValue($val[1]));
        /***********修復in錯誤**************/
        if($zone)
        {
            $whereStr .= $key.' '.$this->exp[$exp].' ('.$zone.')';
        }else{
            $whereStr .= $key.' '.$this->exp[$exp].' (\'\')';
        }
       /***********修復in錯誤 END**************/
         
    }