我对 PHP PDO 中的lastInsertId 问题有疑问

问题描述 投票:0回答:1

我当前的开发环境是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
1个回答
0
投票

虽然文档说

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();

此处演示:https://phpize.online/sql/mysql57/9375b7151cdff272ff418118cc77f888/php/php7/eb428ad79ae577faecab6c9d094beef4/

© www.soinside.com 2019 - 2024. All rights reserved.