PHP按年月条件查询数据库记录失败的解决方法
问题根因
你现有代码有3个核心问题,导致查不到预期结果:
- 筛选逻辑完全错误:
YEAR(data)函数仅会返回日期字段的4位年份整数(比如2022),你写的2022/10是算术除法,计算结果为202.2,不可能和年份值匹配,也完全没实现“同时匹配年、月”的需求。 - 编码设置顺序错误:
mysqli_set_charset必须放在执行查询之前调用,否则字符集配置不会对当前查询生效,还可能出现乱码。 - 没有适配你要求的
MM-YYYY(例:12-2022)输入格式,也没做注入防护,直接传用户输入的话有安全风险。
调整方案
首先解析你拿到的MM-YYYY格式的筛选值,拆分出月份、年份,再通过参数化查询匹配对应记录,两种可直接复用的写法如下:
<?php // 第一步:必须在所有查询前设置字符集 mysqli_set_charset($con, 'UTF8'); // 替换成你实际接收到的筛选参数,例:12-2022 $filterMonthYear = '12-2022'; // 拆分月、年 list($month, $year) = explode('-', $filterMonthYear); $month = intval($month); $year = intval($year); // 写法1:直观易读,适合数据量不大、日期字段没加索引的场景 $stmt = mysqli_prepare($con, "SELECT * FROM eventos WHERE YEAR(`data`) = ? AND MONTH(`data`) = ?"); mysqli_stmt_bind_param($stmt, 'ii', $year, $month); mysqli_stmt_execute($stmt); $resu = mysqli_stmt_get_result($stmt); /* // 写法2:性能更优,能用到data字段的索引,数据量超过1万条优先用这个 $startDate = sprintf('%04d-%02d-01', $year, $month); $endDate = date('Y-m-d', strtotime($startDate . ' +1 month')); $stmt = mysqli_prepare($con, "SELECT * FROM eventos WHERE `data` >= ? AND `data` < ?"); mysqli_stmt_bind_param($stmt, 'ss', $startDate, $endDate); mysqli_stmt_execute($stmt); $resu = mysqli_stmt_get_result($stmt); */ // 后续遍历结果处理业务即可 while ($row = mysqli_fetch_assoc($resu)) { // 写入你的业务逻辑 } ?>
注意:
data是MySQL保留关键字,写SQL时建议给字段名包裹反引号,避免触发语法错误。另外要保证data字段是DATE/DATETIME/TIMESTAMP类型,如果你用字符串存日期,上面的日期函数会失效。
内容的提问来源于stack exchange,提问作者user19417379
相关产品推荐
相关产品推荐

