首页 > 解决方案 > PHP PDO MySql lastInsertId() 返回 0

问题描述

我有以下代码,我从网站中提取并简化了这些代码。此代码仅适用于几个字段

但我无法让 lastInsertId() 工作,它总是返回 0

请帮忙

<?php 

class Db {
  private $host = "localhost";
  private $user = "root";
  private $pwd = "";
  private $dbName = "cms";

  public function connect() {
      
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbName;
    $pdo = new PDO($dsn, $this->user, $this->pwd);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    
    return $pdo;
  }
}


class Jobs extends Db {
    
     public function addJob($job_date_time, $job_type, $job_decs) {
         
        $sql = "INSERT INTO jobs(job_date_time, job_type, job_decs) VALUES (?, ?, ?)";
        
        $stmt = $this->connect()->prepare($sql);
        
        $stmt->execute([$job_date_time, $job_type, $job_decs]);
        
        $lastId = $this->connect()->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);

    
    

标签: phpmysqlpdolast-insert-id

解决方案


lastInsertId()如果您在生成 id 的同一会话中调用该函数,则仅返回最后生成的自动增量 id。

每次调用$this->connect()它都会打开一个新连接,因此它是一个新会话,并且前一个会话的任何状态(例如最后一个插入 ID)都会被重置。

如果已经有一个新连接,您可能打算$this->connect()跳过创建一个新连接。

class Db {
  private $host = "localhost";
  private $user = "root";
  private $pwd = "";
  private $dbName = "cms";
  private $pdo;

  public function connect() {

    if (!$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;
  }
}

这会在您第一次调用时打开一个新连接connect(),但它会将连接保存为对象变量。以后每次调用connect()它时都会使用它之前保存的相同连接。Db该连接在此对象的生命周期内保持打开状态。


推荐阅读