tp3.2
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.php的parseWhereItem方法裡找到下面的程式碼
}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**************/
}