为什么 PDO::lastInsertId 和 Mysql 的 LAST_INSERT_ID() 行为有区别?

问题描述 投票: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个回答
-1
投票

您的代码看起来大部分是正确的,但问题在于 PHP PDO 如何与

lastInsertId()
一起工作。此方法仅返回“最后插入的记录”的 ID,而不是在“查询”之后返回。由于您的逻辑在 UPDATE 之后包含一个
UPDATE
查询,因此此时调用
INSERT
将不再反映插入的 ID。
要解决此问题,只需将调用直接移到 
$db->lastInsertId()
查询之后的

$db->lastInsertId()

即可,它应该按预期工作。

    

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