我当前的开发环境是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函数之前是否只需要执行插入查询。
虽然文档说
lastInsertedId
返回最后插入的行或序列值的 ID
正如您所见,这并不完全正确。它返回最近执行的语句的插入 ID,因此执行新语句(即使它不执行插入)会清除最后一个 id,并且您会得到零。
将调用移动到
lastInsertedId
到语句执行后立即,您应该获得正确的值。
$query = "INSERT INTO test (title) VALUES (:title)";
$stmt = $pdo->prepare($query);
$stmt->bindParam(':title', $title);
$stmt->execute();
echo $pdo->lastInsertId();