【问题标题】:PHP PDO lastInsertId() returns 0 after inserting into table, No Errors or Warnings [duplicate]PHP PDO lastInsertId()插入表后返回0,没有错误或警告[重复]
【发布时间】:2021-03-22 00:45:44
【问题描述】:

我正在尝试获取插入记录后插入 MYSQL 数据库的 ID #(使用自动增量)。我正在使用 PHP PDO lastInsertId()。我使用的是 PHP 7.4 版和 MySQL 8.0.16 版。

这是我的课程和代码。为简洁起见,我删除了一些列名并替换为“...”。

class DB {

private $servername;
private $username;
private $password;
private $dbname;

protected function connect() {
    $this->servername ="removed";
    $this->username ="removed";
    $this->password ="removed";
    $this->dbname ="removed";

    
    try {
        $dsn = "mysql:host=".$this->servername.";dbname=".$this->dbname; //Data Source Name
        $pdo = new PDO($dsn, $this->username, $this->password);
        //$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch(\Exception $exception) {
        echo("Connection Failed: ".$exception->getMessage());
        die();
    }
 

   }
}

    class Product extends DB
    {
    public function addProduct(int $CategoryID, int $BrandID....)
        {        
                $sql = "INSERT into products (CategoryID, BrandID, ....) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                $stmt = $this->connect()->prepare($sql);
                $stmt->execute([$CategoryID, $BrandID, .....]);
                $ProductID = $this->connect()->lastInsertId();            
        }
}

代码将一条记录插入数据库,分配一个唯一标识符,然后为 $ProductID 返回一个 0。我检查了我的日志,没有来自 PHP 的错误或警告。知道我在这里做错了什么吗?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    您应该使用相同的数据库连接来插入行和获取 ID。不要不要在两者之间重新连接。

    您的 addProduct 方法可能如下所示:

    public function addProduct(int $CategoryID, int $BrandID....)
        {        
                $connection = $this->connect();
                $sql = "INSERT into products (CategoryID, BrandID, ....) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                $stmt = $connection->prepare($sql);
                $stmt->execute([$CategoryID, $BrandID, .....]);
                $ProductID = $connection->lastInsertId();            
        }
    

    最好引入一个类变量来存储该数据库连接。例如,您可以查看Use PDO database class without creating new connection every time?


    另外,请重新考虑您的班级结构。使用 DB 类已经是一个好的开始,但模型类不应扩展 DB 类,因为它们不是数据库本身的实例,而是单个实体或表的实例

    【讨论】:

    • 好的,非常感谢。我会做一些编辑,看看我能想出什么。我只是在学习 PDO 和 OOP。感谢您的帮助。
    • 谢谢,将我的方法更改为您拥有的方式,它现在可以工作了。感谢您的所有帮助!
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多