使用php7.2

时间:2018-11-26 08:21:34

标签: pdo mariadb php-7.2

我有以下代码来更新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

1 个答案:

答案 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) 子句已经在验证它是否已设置。

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