php - 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);
解决方案
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
该连接在此对象的生命周期内保持打开状态。
推荐阅读
- c++ - C++17。处理使用 auto 相关的模板参数。代码排序的困难
- unit-testing - 测试用例中的lateinit问题
- selenium - Finding Xpath of element within angular table
- javascript - 如何使用 shopify Polaris DropZone 组件上传图片
- reactjs - 反应 + gsap + scrollMagic
- arrays - Empty output when populating 2D range with array
- c++ - 使用 FASTBuild 分布式构建时找不到 mspdbcore.dll
- powershell - Powershell,Get-MailboxPermission 返回权限,但不能用 Remove-MailboxPermission 更改
- android - 如何在 React Native 项目版本 0.61.x 中重新生成 Android 和 IOS 文件夹?
- ios - 如何使应用程序允许与 SwiftNIO 的传入网络连接?