3.2.3 - 普通 - 已关闭
当想要使用in语句时,如果数组是文本型,生成的$where会被忽略,导致查询是查询整表信息如
$where[‘name’]=array(‘in’,array(‘张三’,’李四’));
$data = M(‘users')->where($where)->select();
从期望值来说,希望生成的语句应该是
select * from tp_users where name in (‘张三’,’李四')
但实际上。因为该in操作的内容是文本型,导致sql语句是
select * from tp_users
而当该表数据量较大(20w)时,又会直接跳掉,执行失败。导致数据出不来。
解决办法 :目前遇上此类方法时,先用
function array_to_sqlin($array){
if(!is_array($array)){
return "";
}
$str = "'".implode("','", $array)."'";
return $str;
}
手工拼接一个in语句,然后再生成sql条件
unset ( $where );
$names = array(‘张三’,’李四’);
$instr = array_to_sqlin($names);
$where = "ajbs in ($instr)";
另外,在使用一些表的时候,有些字段可能是大写的,在mysql中查询是大小写不敏感的(作为条件),但是使用where($where)来进行查询时,如果条件是非大写,会导致生成的sql会忽略掉查询条件。从而导致查询全表,而导致内存溢出而返回空白页停止执行。也非常让人烦恼啊
