PHP PDO操作MySQL时lastInsertId()始终返回0问题求助
问题根因
你每次调用$this->connect()方法都会创建一个全新的PDO数据库连接:插入SQL是在第一个连接上执行的,后续调用lastInsertId()时又新建了第二个独立连接,新连接无法获取前一个连接的插入自增ID,因此始终返回0。
修复方案
- 优化Db类,避免重复创建连接:新增私有属性存储PDO实例,调用connect()时如果实例已存在就直接返回,不用重复新建连接
- 在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
相关产品推荐
相关产品推荐

