SQL查询中调用PHP date函数失效,无法获取今日支出数据
我来帮你搞定这个问题,你的代码里有几个关键问题导致日期无法正确传递到SQL查询中:
问题分析
日期格式不匹配
你用date('d-m-y')生成的是日-月-短年份格式(比如20-05-24),但多数数据库中DATE/DATETIME类型的字段默认存储格式是年-月-日(比如2024-05-20),格式不匹配直接导致查询不到对应数据。SQL语法错误
就算你的time字段是字符串类型,直接把日期值拼进SQL语句却不加单引号,SQL会把它解析成无效的表达式,触发语法错误,查询自然执行失败。SQL注入风险
直接拼接变量到SQL里是非常危险的操作,哪怕是日期这类看似安全的变量,也可能被恶意利用,引发SQL注入攻击。
修正后的代码
public function totalExpense(){ // 生成数据库兼容的标准日期格式(年-月-日) $todays = date('Y-m-d'); // 使用PDO预处理语句,避免语法错误和SQL注入 $sqlQuery = "SELECT SUM(amount) as value FROM price WHERE type='expense' AND DATE(time) = :today"; $sth = $this->dbh->prepare($sqlQuery); // 绑定日期参数,明确参数类型为字符串 $sth->bindParam(':today', $todays, PDO::PARAM_STR); $sth->execute(); $sth->setFetchMode(PDO::FETCH_OBJ); $allData = $sth->fetchAll(); return $allData; }
关键说明
- 日期格式调整:改成
date('Y-m-d')后,生成的日期和数据库DATE类型的默认存储格式完全匹配。如果你的time字段是带时分秒的DATETIME类型,用DATE(time)可以提取纯日期部分进行匹配,确保当天所有时间的记录都能被统计到。 - 预处理语句:用
prepare()+占位符:today的方式,PDO会自动处理字符串的引号问题,同时彻底杜绝SQL注入风险。 - 参数绑定:
bindParam()明确参数类型为字符串,保证传递给数据库的数据类型正确。
如果你的time字段存储的是时间戳(数字类型),那只需要把日期转成时间戳即可:
// 生成当天零点的时间戳 $todays = strtotime(date('Y-m-d')); // SQL语句去掉DATE()函数 $sqlQuery = "SELECT SUM(amount) as value FROM price WHERE type='expense' AND time = :today";
内容的提问来源于stack exchange,提问作者fahim hasan
相关产品推荐
相关产品推荐

