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
相关产品推荐
相关产品推荐

