我当前的开发环境是PHP 7.2。 这是 MariaDB 10.3.11。
使用PDO的lastInsertId函数时,如果在插入查询后运行另一个查询,则lastInsertId结果值将始终为0。
示例表是
create table test
(
id int unsigned auto_increment comment 'PK' primary key,
title varchar(128) charset utf8mb4 not null comment 'title'
)
comment 'test';
create table test2
(
id int unsigned auto_increment comment 'PK' primary key,
title varchar(128) charset utf8mb4 not null comment 'title'
)
comment 'test2';
示例代码是
public function pdoTest()
{
$title = "test";
$id = 1;
$db = new PDO('mysql:host=<your-host>;port=<your-port>;dbname=<your-dbname>;charset=utf8', '<your-username>', '<your-password>');
$db->beginTransaction();
$query = "INSERT INTO test (title) VALUES (:title)";
$stmt = $db->prepare($query);
$stmt->bindParam(':title', $title);
$stmt->execute();
$updateQuery = "UPDATE test2 SET title = :title WHERE id = :id";
$stmt = $db->prepare($updateQuery);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':title', $title);
$stmt->execute();
echo $db->lastInsertId();
$db->commit();
}
上述情况,lastInsertId的返回值为0。我搜索了PHP站点。有谁知道为什么lastInsertId无法正常工作?
我想知道在执行lastInsertId函数之前是否只需要执行插入查询。
您的代码看起来大部分是正确的,但问题在于 PHP PDO 如何与
lastInsertId()
一起工作。此方法仅返回“最后插入的记录”的 ID,而不是在“查询”之后返回。由于您的逻辑在 UPDATE
之后包含一个 UPDATE
查询,因此此时调用 INSERT
将不再反映插入的 ID。要解决此问题,只需将调用直接移到 $db->lastInsertId()
查询之后的 $db->lastInsertId()
即可,它应该按预期工作。