我们正在将应用程序从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());
}
2条答案
按热度按时间svujldwt1#
可能是php5.6附带的phpëpdo模块,因为php5.6的经典mysql模块即使在select语句之后也会保留最后一个insert id。
我们在php7.2中遇到了这个问题,因为mysql模块在这个版本中被删除了,最后我们很多人选择pdoèu模块作为替代。
为了解决这个问题,我在insert语句之后直接将结果赋给一个临时变量。
8iwquhpp2#
我用mariadb 5.5.60在php5.6.37上运行了您的测试代码,得到了以下答案:
所以这种行为并不局限于php7.2。我觉得这种行为并不奇怪,毕竟,当你在数据库上执行一个新的查询时,pdo驱动程序中会发生很多事情。
我的建议是,也许这不是你想听到的,总是在插入之后直接请求最后一个insert id。