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

PHP PDO操作MySQL时lastInsertId()始终返回0问题求助

问题根因

你每次调用$this->connect()方法都会创建一个全新的PDO数据库连接:插入SQL是在第一个连接上执行的,后续调用lastInsertId()时又新建了第二个独立连接,新连接无法获取前一个连接的插入自增ID,因此始终返回0。

修复方案

  1. 优化Db类,避免重复创建连接:新增私有属性存储PDO实例,调用connect()时如果实例已存在就直接返回,不用重复新建连接
  2. 在addJob方法中先获取一次连接实例存到变量,后续所有操作都用同一个实例执行

修改后的完整代码如下:

<?php 

class Db {
  private $host = "localhost";
  private $user = "root";
  private $pwd = "";
  private $dbName = "cms";
  // 新增属性存储PDO连接实例
  private ?PDO $pdo = null;

  public function connect() {
    // 已经有连接就直接返回,不重复创建
    if ($this->pdo instanceof PDO) {
      return $this->pdo;
    }
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbName;
    $this->pdo = new PDO($dsn, $this->user, $this->pwd);
    $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    
    return $this->pdo;
  }
}


class Jobs extends Db {
    
     public function addJob($job_date_time, $job_type, $job_decs) {
        // 先获取一次连接,后续所有操作都用同一个连接实例
        $pdo = $this->connect();
        $sql = "INSERT INTO jobs(job_date_time, job_type, job_decs) VALUES (?, ?, ?)";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$job_date_time, $job_type, $job_decs]);
        
        $lastId = $pdo->lastInsertId();
        echo $lastId; 
      }
}     

$jobs = new Jobs();
$job_date_time      = "2021-11-11T11:40";
$job_type           = "Test Type";
$job_desc           = "Test Desc";
$jobs->addJob($job_date_time, $job_type, $job_desc);

补充注意事项

如果修复后还是返回0,检查你的jobs表是否有设置AUTO_INCREMENT的自增主键字段,没有自增主键的话lastInsertId()也无法返回正确值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:01