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

MySQL查询近7天数据时出现MariaDB语法错误求助

解决你的MySQL语法错误及安全优化建议

我一眼就揪出问题所在啦!咱们一步步来搞定:

1. 致命SQL语法错误的核心原因

错误提示里提到的near 'DAYS GROUP BY',是因为你在INTERVAL子句里用了复数形式的DAYS——MariaDB/MySQL要求INTERVAL的时间单位必须是单数形式(比如DAY、HOUR),绝对不能用复数。

另外,你原本写的日期范围CURDATE() AND CURDATE() + INTERVAL 7 DAYS是查询未来7天的数据,但你想要的是今日及往前7天,逻辑完全搞反了,得调整成过去7天到今天的范围。

2. 修正后的SQL核心片段

把错误的日期条件和单位改过来,正确的条件应该是:

WHERE logins.unique_id=? 
AND step_count.date BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE()

(这里用?是为了后续的安全优化,往下看就懂啦)

3. 紧急修复SQL注入风险

你直接把$unique_id拼进SQL语句里,这会导致严重的SQL注入漏洞!别等被攻击了才后悔,赶紧换成mysqli预处理语句,既安全又能避免引号转义的麻烦。

完整修正后的PHP代码

<?php
// 获取联赛积分信息
// 使用预处理语句彻底杜绝SQL注入
$stmt = $link->prepare("
    SELECT SUM(DISTINCT step_count.steps) as total, 
           logins.nickname, 
           MAX(step_count.steps) as maxsteps, 
           ROUND(AVG(DISTINCT step_count.steps)) as average, 
           logins.Email as email 
    FROM step_count 
    INNER JOIN logins on step_count.unique_id=logins.unique_id 
    WHERE logins.unique_id=? 
      AND step_count.date BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE()
    GROUP BY logins.unique_id 
    ORDER BY `total` DESC
");
// 绑定参数:如果$unique_id是字符串类型用's',数字类型用'i'
$stmt->bind_param('s', $unique_id);
$stmt->execute();
$result = $stmt->get_result();

while($row = $result->fetch_assoc()){
    // 这里写你的数据处理逻辑
}
?>

改完后的好处

  • 把7 DAYS改成7 DAY:完美符合MariaDB的INTERVAL语法规范,直接解决了语法错误。
  • 调整日期范围:准确获取今日及过去7天的数据,完全匹配你的需求。
  • 使用预处理语句:彻底堵住SQL注入的漏洞,同时避免了变量拼接时的引号、转义等坑。

内容的提问来源于stack exchange,提问作者user9099892

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:55