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

