pdo::lastinsertid在select之后重置

dl5txlt9  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(242)

我们正在将应用程序从php5.5.9升级到php7.2(目前为7.2.7),无意中发现了以下问题。
执行插入查询并立即运行lastinsertid时,返回的值是正确的。但是,如果在这两者之间执行select查询,lastinsertid将返回0。这在php5.5.9中没有发生。
我们的mysql版本是5.7.22,但我不认为这是相关的,因为我们有相同的mysql版本在另一台机器上与PHP5.5,我们没有问题。
如果运行“select last_insert_id();”作为一个原始查询(通过pdo),您得到的结果是正确的,因此这似乎是pdo的lastinertid的一个bug。
下面是一个示例代码段,您可以使用它来重现问题:

<?php

$username = "username";
$password = "password";    

$pdo = new PDO("mysql:host=127.0.0.1;port=3306;dbname=test_db", $username, $password);
    $pdo->query("CREATE TABLE IF NOT EXISTS `test_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `random_field` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;");
    $st = $pdo->query("INSERT INTO test_table(random_field) VALUES (" . rand(1, 100000) . ")");
    if($st){
        echo "last_insert_id: " . $pdo->lastInsertId() . "\n";
        $pdo->query("SELECT 1 + 1");
        echo "last_insert_id: " . $pdo->lastInsertId() . "\n";
    }
    else{
        var_dump($pdo->errorInfo());
    }
svujldwt

svujldwt1#

可能是php5.6附带的phpëpdo模块,因为php5.6的经典mysql模块即使在select语句之后也会保留最后一个insert id。
我们在php7.2中遇到了这个问题,因为mysql模块在这个版本中被删除了,最后我们很多人选择pdoèu模块作为替代。
为了解决这个问题,我在insert语句之后直接将结果赋给一个临时变量。

8iwquhpp

8iwquhpp2#

我用mariadb 5.5.60在php5.6.37上运行了您的测试代码,得到了以下答案:

last_insert_id: 4 
last_insert_id: 0

所以这种行为并不局限于php7.2。我觉得这种行为并不奇怪,毕竟,当你在数据库上执行一个新的查询时,pdo驱动程序中会发生很多事情。
我的建议是,也许这不是你想听到的,总是在插入之后直接请求最后一个insert id。

相关问题