如何在SQL中结合LIKE与BETWEEN?现有日期查询代码问题排查
你的SQL查询存在的问题及修正方案
首先,咱们先拆解你当前代码里的几个关键错误:
1. 范围查询的逻辑完全错误
你用了两个LIKE条件来匹配日期范围:
DATE_CREATION like '%$date3%' and DATE_CREATION like '%$date4%'
这会要求DATE_CREATION字段同时包含$date3和$date4的字符串内容,而不是在这两个日期之间。比如如果$date3是2024-05-01,$date4是2024-05-10,只有当某个记录的日期字符串里同时有这两个日期片段时才会被匹配——这显然和你想要的“两个日期之间的记录”完全不符。
2. 严重的SQL注入风险
直接把变量$uuc、$date3、$date4拼接到SQL语句里,没有做任何转义或预处理,这会让你的代码面临SQL注入攻击的风险,攻击者可以通过构造恶意变量值来篡改你的SQL逻辑,甚至删除整个数据表。
正确的实现方案
针对你的需求(获取两个日期之间的带时间的记录),这里有两种靠谱的写法,同时解决上述问题:
方案一:使用>=和<=处理完整DateTime范围
假设$date3是起始日期(比如2024-05-01),$date4是结束日期(比如2024-05-10),我们需要把结束日期补全到当天的最后一秒,确保包含当天所有时间的记录:
// 推荐使用预处理语句防止SQL注入 $query = "SELECT * FROM justshawarma_nexo_commandes WHERE REF_CLIENT = ? AND DATE_CREATION >= ? AND DATE_CREATION <= ?"; // 假设你用的是PDO,预处理执行示例 $stmt = $pdo->prepare($query); $endDate = $date4 . ' 23:59:59'; $stmt->execute([$uuc, $date3, $endDate]); $records = $stmt->fetchAll();
方案二:提取日期部分进行范围匹配
如果你只关心日期,不考虑具体时间,可以用DATE()函数提取DATE_CREATION的日期部分,再用BETWEEN做范围查询:
$query = "SELECT * FROM justshawarma_nexo_commandes WHERE REF_CLIENT = ? AND DATE(DATE_CREATION) BETWEEN ? AND ?"; $stmt = $pdo->prepare($query); $stmt->execute([$uuc, $date3, $date4]); $records = $stmt->fetchAll();
⚠️ 注意:如果DATE_CREATION字段有索引,使用DATE()函数会导致索引失效,影响查询性能。如果你的数据表数据量较大,优先选择方案一。
内容的提问来源于stack exchange,提问作者user9578112
相关产品推荐
相关产品推荐

