lastInsertId () с оператором UPDATE возвращает 0 при использовании php7.2 - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код для обновления строки в таблице 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!';
}

Часть my_id = LAST_INSERT_ID(my_id) в моем предложении SET устанавливает значение LAST_INSERT_ID() для DB Марии в значение `my_id` обновленной строки.

Выполнение SELECT LAST_INSERT_ID(); в моем клиенте sql подтверждает, что значение установлено (результат = 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 голосов
/ 27 ноября 2018

Удалите это:

   , `my_id`   = LAST_INSERT_ID(my_id)

В этом нет необходимости;предложение WHERE уже проверяет, что оно установлено.

Я не могу сказать, изменилось ли что-то;но я действительно думаю, что вы должны изменить свой код.

...