实现用户每日首次登录加积分功能时SQL更新失败
问题排查与修复方案
1. 语法错误(导致SQL完全无法执行的核心原因)
你的修改后的SQL存在两处语法问题:
- 运算符位置错误:将大小判断逻辑写到了
DATEDIFF函数的入参中,正确的语法是DATEDIFF(日期1, 日期2) > 0,而非DATEDIFF(日期1, 日期2>0) - 括号不匹配:WHERE条件中多了一个多余的左括号,没有对应的右括号完成闭合
2. 逻辑错误(语法修复后依然无法正确触发的原因)
主流数据库的DATEDIFF函数计算规则为前者减后者,以最常用的MySQL为例:DATEDIFF(date1, date2)返回的是date1减去date2的天数差值。
你写的DATEDIFF(accounts.lastpoint, CURRENT_TIMESTAMP),当lastpoint早于当前时间时,返回值为负数,永远无法满足>0的判断条件,因此更新逻辑永远不会触发。
3. 最终修复代码
建议使用CURRENT_DATE替代CURRENT_TIMESTAMP,仅比较日期部分避免时间误差,同时兼容新用户首次登录(lastpoint为NULL)的场景,修复后代码如下:
$add1point4login = "UPDATE accounts SET points = points + 1, lastpoint = CURRENT_TIMESTAMP WHERE username='".$_SESSION['name']."' AND (DATEDIFF(CURRENT_DATE, accounts.lastpoint) >= 1 OR accounts.lastpoint IS NULL)";
4. 安全提示
当前直接拼接$_SESSION['name']到SQL语句中存在SQL注入风险,建议改为使用PDO或MySQLi的预处理语句执行SQL操作,规避注入漏洞。
内容的提问来源于stack exchange,提问作者ZF-Dev
相关产品推荐
相关产品推荐

