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

SQL查询中调用PHP date函数失效,无法获取今日支出数据

我来帮你搞定这个问题,你的代码里有几个关键问题导致日期无法正确传递到SQL查询中:

问题分析

  1. 日期格式不匹配
    你用date('d-m-y')生成的是日-月-短年份格式(比如20-05-24),但多数数据库中DATE/DATETIME类型的字段默认存储格式是年-月-日(比如2024-05-20),格式不匹配直接导致查询不到对应数据。

  2. SQL语法错误
    就算你的time字段是字符串类型,直接把日期值拼进SQL语句却不加单引号,SQL会把它解析成无效的表达式,触发语法错误,查询自然执行失败。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:13:36