使用php7.2时,带有UPDATE语句的lastInsertId()返回0



我有以下代码来更新MariaDB表中的一行:

<?php
$statement = <<<SQL
UPDATE `my_table`
SET
`my_name` = :my_name,
`my_id`   = LAST_INSERT_ID(my_id)
WHERE `my_id` = :my_id;
SQL;
try {
$sth = $this->dbh->prepare($statement);
$sth->bindValue(':my_name', 'Foo');
$sth->bindValue(':my_id', 12, PDO::PARAM_INT);
$sth->execute();
if ($this->dbh->lastInsertId() == 0) {
echo 'Id not found!';
}
} catch (PDOException $e) {
echo 'Transaction failed!';
}

SET子句中的my_id = LAST_INSERT_ID(my_id)部分将Maria DB的LAST_INSERT_ID()的值设置为更新行的"my_id"的值。

在我的sql客户端中执行SELECT LAST_INSERT_ID();会确认值已设置(结果=12(。

在php中,我使用PDO::lastInsertId来获取这个值,如果它为0,则不存在匹配的行。通过这种方式,我可以区分"my_id不存在"错误和无提示的UPDATE(以及所有其他事务错误(。

这在PHP5.6.23/MariaDB10.1.13中运行良好,但现在我使用的是PHP7.2.11/MariaDB10.1.36,并且当行确实更新时,PDO::lastInsertId的返回值保持为零。

PDO::lastInsertId的行为在这两个版本之间是否发生了变化?是某种虫子吗?代码以前是否意外工作,但其中包含错误或其他内容?

感谢您的回复。


编辑:我可以确认代码仍然适用于PHP v7.1.8

删除此:

, `my_id`   = LAST_INSERT_ID(my_id)

没有必要这样做;CCD_ 7子句已经在验证它是否被设置。

我不能说是否有什么改变;但我真的认为你应该更改你的代码。

最新更新