Есть код, упрощенный вариант:
$dsn = DbConfig::$dbDriver . ':dbname=' . DbConfig::$dbname . ';host=' . DbConfig::$dbhost;
$dbh = new \PDO($dsn, DbConfig::$dbuser, DbConfig::$dbuserpass, array(
1002 => 'SET NAMES utf8',
\PDO::ATTR_PERSISTENT => true,
\PDO::ATTR_EMULATE_PREPARES => false,
\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
));
$sqlTxt = "UPDATE `table` SET `value` = :d_value WHERE `id` = :w_id ";
$dataParams = [':d_value' => $value + 1, ':w_id' => 1];
$sth = $dbh->prepare($sqlTxt);
$sth->execute($dataParams);
$value содержит ответ из select предыдущего запроса к этой же таблице.
print_r($dataParams); выводит
:d_value=>2
:w_id=>1
В базу данных в value записывается 3
При следующем запросе запишет 5
если конструкцию обернуть в if то в базу запишется 2, как и ожидалось. если переменной $value присвоить число 1 то тоже будет ожидаемый результат.
Не понимаю почему так происходит. Бага отрабатывает на centos7 php 7.0.15-7.0.16. на других версиях php бага не работает.