我们正在将应用程序从PHP 5.5.9升级到PHP 7.2(当前为7.2.7),偶然发现了以下问题。
当执行INSERT查询然后立即运行lastInsertId时,它返回的值是正确的。但是,如果在两者之间执行SELECT查询,lastInsertId将返回0。在PHP 5.5.9中不会发生这种情况。
我们的MySQL版本是5.7.22,但我认为这无关紧要,因为我们在另一台装有PHP 5.5的计算机上具有相同的MySQL版本,并且那里没有问题。
如果您运行“ SELECT LAST_INSERT_ID();”作为原始查询(通过PDO),您得到的结果是正确的,因此这似乎是PDO的lastInsertId的错误。
以下是示例代码段,您可以使用该代码段重现该问题:
<?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());
}
答案 0 :(得分:1)
我使用MariaDB 5.5.60在PHP 5.6.37上运行了测试代码,我得到了以下答案:
last_insert_id: 4
last_insert_id: 0
因此,此行为不仅限于PHP 7.2。毕竟,当您在数据库上执行新查询时,我没有发现这么奇怪的行为。
我的建议是,也许这不是您想听到的,总是在插入后总是直接询问最后一个插入ID。
答案 1 :(得分:0)
可能是PHP 5.6附带的php_pdo模块,因为PHP 5.6的经典mysql模块即使在执行select语句后仍保留最后的插入id。
我们在PHP 7.2中遇到了这个问题,因为在此版本中删除了mysql模块,最后我们许多人选择了pdo_module作为替代。
为解决此问题,我在插入语句之后直接将结果分配给了一个临时变量。