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

PDO插入数据时DATETIME字段异常,存入0000-00-00 00:00:00

解决PDO插入DATETIME字段变为0000-00-00 00:00:00的问题

我之前碰到好几个类似的情况,这种DATETIME字段存成默认0值的问题,大概率是日期格式不匹配或者参数绑定出错导致的,咱们一步步来排查解决:

1. 先明确MySQL DATETIME的要求

MySQL的DATETIME字段只认YYYY-MM-DD HH:MM:SS格式的字符串,如果你传入的是DD/MM/YYYY、YYYY/MM/DD或者其他非标准格式,MySQL无法解析,就会自动存入0000-00-00 00:00:00。

2. 检查你的参数绑定与日期处理

从你给出的代码片段来看,你用了:tanggal和:ending绑定日期字段,这里需要确保:

  • 传入的日期值已经转成了MySQL支持的格式
  • 这两个参数确实被正确绑定到了SQL语句中

给你修改后的代码示例,重点处理日期格式和参数绑定:

public function NewDepo($array){
    if(!empty($array)){ // 用!empty比isset更严谨,避免空数组
        try {
            // 处理日期格式:把输入的日期转成MySQL兼容的格式
            // 如果$array['tanggal']是时间戳或者可解析的日期字符串,strtotime能识别
            $tanggal = isset($array['tanggal']) ? date('Y-m-d H:i:s', strtotime($array['tanggal'])) : date('Y-m-d H:i:s');
            
            // 如果depo_end允许为空,就转成格式后的值,否则传当前时间或者必填值
            $ending = isset($array['ending']) && $array['ending'] ? date('Y-m-d H:i:s', strtotime($array['ending'])) : null;

            $stmt = $this->conn->prepare("INSERT INTO `depo` (`depo_id`, `depo_trx`, `depo_address`, `depo_total`, `depo_status`, `depo_date`, `depo_end`) 
                                        VALUES (NULL, :trx, :add, :total, 1, :tanggal, :ending)");
            
            // 逐个绑定参数,明确参数类型更安全
            $stmt->bindParam(':trx', $array['depo_trx'], PDO::PARAM_STR); // 注意数组键名要和你实际传入的一致
            $stmt->bindParam(':add', $array['depo_address'], PDO::PARAM_STR);
            $stmt->bindParam(':total', $array['depo_total'], PDO::PARAM_INT); // 如果是金额可以用PARAM_FLOAT
            $stmt->bindParam(':tanggal', $tanggal, PDO::PARAM_STR);
            $stmt->bindParam(':ending', $ending, PDO::PARAM_STR);

            if($stmt->execute()){
                return $this->conn->lastInsertId(); // 返回插入的ID方便后续操作
            } else {
                // 调试用:打印错误信息
                print_r($stmt->errorInfo());
                return false;
            }
        } catch(PDOException $e) {
            // 捕获异常,方便排查
            echo "插入失败:" . $e->getMessage();
            return false;
        }
    }
    return false;
}

3. 额外的排查点

  • 时区问题:如果PHP的时区和MySQL的时区不一致,可能导致日期解析错误。可以在PDO连接时设置时区:
    $this->conn = new PDO($dsn, $user, $pass, [
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone = '+08:00'", // 改成你的时区
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // 开启异常模式,方便捕获错误
    ]);
    
  • 字段约束:检查depo_date和depo_end字段是否设置为NOT NULL,如果是,但你传入了无效值,MySQL就会用0值填充。如果允许为空,确保代码中可以传入NULL。
  • 调试技巧:在execute()之前,用var_dump($tanggal, $ending)查看日期值是否正确;或者用$stmt->debugDumpParams()打印绑定的参数详情,确认参数是否正确传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:40:11