PDO日期范围查询失效问题求助(附相关代码)
问题根源:$params数组结构混乱
我一眼就瞅出问题出在你的$params数组构建逻辑上啦!你前面的参数是往数组里嵌套子数组,到日期参数又直接加一维键值对,这种混合结构让PDO根本没法正确匹配命名参数,自然查询就失效了。
看这段代码就明白:
if ($brand_status) { $extra .= "brand_status=:brand_status and "; $params[] = array("brand_status" => $brand_status); // 这里把参数包装成子数组塞进去了! }
这会让$params变成二维数组,但到日期参数时你又用了一维赋值:
$params['date_start'] = $date_start; $params['date_end'] = $date_end;
PDO接收的参数数组要求是标准的一维键值对,这种混乱结构它根本识别不了。
修复方案:统一构建一维键值对数组
把所有参数都直接以键值对的形式添加到$params里,不要再嵌套子数组。修改后的关键代码如下:
$extra = ''; $params = array(); // 初始化为一维空数组 $sql = "SELECT * FROM brands ORDER BY brand_name"; $brand_status = "1"; $brand_name = ""; $date_start = "2017-05-01 00:00:00"; $date_end = "2017-06-30 23:59:59"; if ($brand_status) { $extra .= "brand_status=:brand_status and "; $params['brand_status'] = $brand_status; // 直接添加键值对,不再嵌套子数组 } if ($brand_name) { $extra .= "brand_name LIKE :brand_name and "; $params['brand_name'] = "%" . $brand_name . "%"; // 同样用一维键值对 } if (dbDate($date_start)==1 and dbDate($date_end)==1) { $extra .= "date_start >= :date_start and date_end <= :date_end and "; $params['date_start'] = $date_start; // 这里的写法本来就正确,保持即可 $params['date_end'] = $date_end; } // 后续SQL拼接和执行逻辑保持不变 if (count($params) > 0) { if (strlen($extra) > 0) { $extra = rtrim($extra, ' and '); } $sql = "SELECT * FROM brands WHERE $extra ORDER BY brand_name"; $query = $db->prepare($sql); $result = $query->execute($params); // 现在$params是标准一维数组,PDO能正确绑定 } else { $result = $query = $db->query($sql); } // 剩下的结果处理逻辑不变...
额外小建议
- 拼接$extra时可以给开头加个空格,比如写成
$extra .= " brand_status=:brand_status and ";,避免SQL拼接时出现字段连在一起的语法错误。 - 虽然你用的PHP5.6.30版本支持数组直接传execute,但如果后续有复杂参数类型(比如整数、布尔值),可以试试用
bindParam或bindValue来指定参数类型,安全性会更高。
内容的提问来源于stack exchange,提问作者webmaster
相关产品推荐
相关产品推荐

