我有以下代码来更新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不存在”错误和无提示的无声更新(以及所有其他事务错误)。
这在PHP 5.6.23 / MariaDB 10.1.13 中可以正常工作,但是现在我在PHP 7.2.11 / MariaDB中 10.1.36 ,而实际上更新行时,PDO::lastInsertId
的返回值保持为零。
两个版本之间PDO::lastInsertId
的行为是否发生变化?
是某种错误吗?
该代码之前是否曾经偶然地工作过,但是其中包含错误或其他内容?
感谢您的回复。
编辑:我可以确认代码仍可用于PHP v7.1.8
答案 0 :(得分:0)
删除此:
String sample = "Hello World";
// substring() examples
System.out.println(sample.substring(0,5); // This would give you an output of "Hello"
System.out.println(sample.substring(6, sample.length()); // This would give you "World"
// charAt() examples
System.out.println(sample.charAt(4)); // This would return 'o'
System.out.println(sample.charAt(str.length() - 1); // This would give you 'd'
没有必要; , `my_id` = LAST_INSERT_ID(my_id)
子句已经在验证它是否已设置。
我不能说是否有所改变;但我真的认为您应该更改代码。