在WHERE子句中传入数组执行SQL查询失败的问题排查
SQL IN子句使用数组筛选失效的原因与解决方案
问题原因
- SQL语法错误:日期比较逻辑写错,原代码中
kampanya_baslamatarih<' . $tarih . '<kampanya_bitistarihi缺少逻辑运算符和完整比较符号,正确逻辑应该是kampanya_baslamatarih < ? AND ? < kampanya_bitistarihi(可根据实际需求调整比较方向)。 - 类型不匹配+SQL注入风险:直接将数组拼接成带单引号的字符串插入IN子句,若
kampanya_ID是数字类型,额外的单引号会触发MySQL隐式类型转换,导致筛选结果异常;同时未做参数绑定,存在SQL注入风险。 - 日期格式不兼容:PHP的
date("Y/m/d")生成斜杠分隔的日期,而MySQL默认DATE类型格式为YYYY-MM-DD,格式不匹配会导致日期比较逻辑失效。
解决方案
1. 修正代码(使用参数绑定)
PHP业务逻辑部分
if (count(is_countable($ekkampanyaId) ? $ekkampanyaId : []) > 0) { $ekkampanyalar = $Panel_Model->urunkampanyalistele($ekkampanyaId, date("Y-m-d")); }
Model查询方法部分
public function urunkampanyalistele($kampanyaIds, $tarih) { // 根据数组长度生成对应数量的占位符 $placeholders = rtrim(str_repeat('?,', count($kampanyaIds)), ','); $sql = "SELECT kampanya_ID, kampanya_indirimyuzde FROM flora_kampanya WHERE kampanya_ID IN ($placeholders) AND kampanya_aktiflik = 1 AND kampanya_baslamatarih < ? AND ? < kampanya_bitistarihi"; // 合并数组参数与日期参数 $params = array_merge($kampanyaIds, [$tarih, $tarih]); return $this->db->select($sql, $params); }
2. 关键说明
- 参数绑定:用占位符
?替代直接字符串拼接,由数据库驱动自动处理类型转换,既避免SQL注入,也保证数据类型匹配。 - 日期格式:将
date("Y/m/d")改为date("Y-m-d"),匹配MySQL DATE类型默认格式,确保日期比较逻辑正确。 - IN子句占位符:根据数组长度生成对应数量的占位符,保证每个数组元素都能正确传入查询。
内容的提问来源于stack exchange,提问作者Savas çiftci
相关产品推荐
相关产品推荐

