You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:57:10