
本文介绍如何在mysql中正确使用year()和month()函数,结合php动态构建sql查询语句,实现按指定年份和月份(如“2022-10”)精准筛选日期字段的记录,并修正常见语法错误。
本文介绍如何在mysql中正确使用year()和month()函数,结合php动态构建sql查询语句,实现按指定年份和月份(如“2022-10”)精准筛选日期字段的记录,并修正常见语法错误。
在实际开发中,经常需要根据用户选择的年份和月份(例如“2022年10月”)从数据库中检索对应时间段的记录。原始代码存在两个关键问题:一是YEAR(data) = 2022/10使用了错误的数学除法运算,而非逻辑条件;二是未同时约束月份,导致结果不精确。
正确的做法是分别使用 YEAR() 和 MONTH() 函数独立提取年、月,并用 AND 连接条件。以下是修复后的完整示例(含安全防护):
<?php // 假设用户输入为 $year = 2022, $month = 10
$year = (int)$_GET['year'] ?? date('Y'); // 防注入:强制转整型
$month = (int)$_GET['month'] ?? date('n');
// 使用预处理语句(推荐)或严格校验后的字符串拼接
$sqli = "SELECT * FROM eventos WHERE YEAR(data) = ? AND MONTH(data) = ?";
$stmt = mysqli_prepare($con, $sqli);
mysqli_stmt_bind_param($stmt, "ii", $year, $month);
mysqli_stmt_execute($stmt);
$resu = mysqli_stmt_get_result($stmt);
mysqli_set_charset($con, 'UTF8');
?>
⚠️ 重要注意事项:
- ❌ 避免直接拼接用户输入(如 sprintf("... %d", $_GET['year'])),极易引发SQL注入;
- ✅ 推荐始终使用预处理语句(Prepared Statements),确保参数类型安全;
- ? 若 data 字段为 DATE 或 DATETIME 类型,上述函数可高效利用索引(但注意:对函数字段加索引需谨慎,生产环境建议配合生成列或范围查询优化);
- ? 替代方案(更优性能):使用日期范围查询,例如 data >= '2022-10-01' AND data
总结:精准按年月查询的核心是分离年、月条件并安全传参。优先采用预处理语句,兼顾安全性与可维护性;在高并发场景下,可进一步评估是否改用区间查询提升执行效率。










