You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:35:23