После перехода на PHP 7.2 я наткнулся на совершенно странное поведение ранее обработанного кода.У меня есть оболочка PDO для вставки данных.Это код тривиален:
public static function Insert($table_name, $data)
{
if (!self::$connection)
{
return false;
}
$sql = 'INSERT INTO ' . $table_name . ' ';
$data_keys = array_keys($data);
$sql .= ' (' . implode(',', $data_keys) . ') ' . ' VALUES (:' . implode(',:', $data_keys) . ') ';
self::$stmt = self::$connection->prepare($sql);
foreach ($data as $key => $value)
{
$val = !empty($value) ? $value : '';
self::$stmt->bindParam(':' . $key, $val);
}
try
{
$result = self::$stmt->execute();
self::$last_id = self::$connection->lastInsertId();
}
catch (Exception $ex)
{
logging($ex->getMessage());
ob_start();
self::$stmt->debugDumpParams();
$dump = ob_get_contents();
logging($dump);
ob_end_clean();
logging(self::showLastError(true));
}
return $result;
}
В моем тесте я отправляю простые данные:
QuickPDO::Insert('history',
array('dictionaries_version' => '100005333', 'id_db' => 327, 'latest_update' => date('Y-m-d H:i:s')));
Подготовленное утверждение:
INSERT INTO history (dictionaries_version,id_db,latest_update)
VALUES (:dictionaries_version,:id_db,:latest_update)
И я получил предупреждение: SQLSTATE [01000]: Предупреждение: 1265 Данные усечены для столбца id_db в строке 1 Ничего не вставлено.Просматривая журнал:
Sent SQL: [141] INSERT INTO history (dictionaries_version,id_db,latest_update)
VALUES ('2018-06-11 00:32:05','2018-06-11 00:32:05','2018-06-11 00:32:05')
Мы видим, что последний параметр связан только с оператором!Я проверил около десяти раз, в цикле $key
и $val
назначены правильно.Этот код работал в PHP 5.6, но не работает в PHP 7.2.Как я могу это исправить?Или какой-то обходной путь?