
本文介绍如何通过 PDO 预处理语句安全、准确地查询 MySQL 中指定日期范围内的记录,避免 SQL 注入风险,并纠正 LIKE 模糊匹配日期的常见错误。
本文介绍如何通过 pdo 预处理语句安全、准确地查询 mysql 中指定日期范围内的记录,避免 sql 注入风险,并纠正 `like` 模糊匹配日期的常见错误。
在 Web 开发中,按日期范围筛选数据是高频需求,但初学者常误用 LIKE 进行日期匹配(如 date LIKE "%2023-01-01%"),这不仅逻辑错误(LIKE 无法正确表达“区间”含义),更存在严重 SQL 注入漏洞——用户可轻易通过恶意输入(如 ' OR '1'='1)篡改查询逻辑。
✅ 正确做法是:使用 BETWEEN 操作符 + PDO 预处理语句,确保类型安全与参数隔离。
以下为完整、可直接运行的安全示例:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
<?php
try {
// 1. 建立 PDO 连接(请替换为您的实际配置)
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$pdo = new PDO($dsn, 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// 2. 构建基础查询(注意:WHERE 1=1 便于动态拼接条件)
$sql = "SELECT * FROM orders WHERE 1=1";
// 3. 动态添加日期范围条件(仅当参数存在且非空时)
$params = [];
if (!empty($_REQUEST['datefrom'])) {
$sql .= " AND date >= :datefrom";
$params['datefrom'] = $_REQUEST['datefrom']; // 推荐使用标准格式:Y-m-d 或 Y-m-d H:i:s
}
if (!empty($_REQUEST['dateto'])) {
$sql .= " AND date <= :dateto";
$params['dateto'] = $_REQUEST['dateto'];
}
// 4. 准备并执行预处理语句
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
// 5. 获取结果
$results = $stmt->fetchAll();
print_r($results);
} catch (PDOException $e) {
error_log("Database error: " . $e->getMessage());
echo "查询失败,请稍后重试。";
}
?>? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 日期格式必须一致:MySQL 的 DATE/DATETIME 字段要求输入为 'Y-m-d'(如 '2023-01-01')或 'Y-m-d H:i:s'。前端建议用 保证格式合规。
- ✅ 避免 BETWEEN 的隐含陷阱:BETWEEN '2023-01-01' AND '2023-01-31' 在 DATETIME 字段中仅匹配到 2023-01-31 00:00:00,若需包含全天,推荐使用 date
- ❌ 禁止字符串拼接 SQL(如 "AND date LIKE '%".$_REQUEST['date']."%'"),这是 SQL 注入高危行为。
- ? 始终启用 PDO::ERRMODE_EXCEPTION 并捕获异常,便于调试与安全兜底。
通过以上方式,您不仅能精准筛选日期区间,更能构建健壮、可维护、符合现代安全规范的 PHP 数据访问层。


















