PDO повторяет последний параметр bind - PullRequest
0 голосов
/ 11 июня 2018

После перехода на 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.Как я могу это исправить?Или какой-то обходной путь?

1 Ответ

0 голосов
/ 11 июня 2018

... и это не удалось немного больше времени назад.

Вы связываете параметр по ссылке и используете ту же самую переменную $value, чтобы связать все ваши параметры.Я удивлен, что это работает раньше.Предположим, что в PHP 5.6 и 7.2

произошли некоторые изменения, связанные со ссылками / переменными. В качестве обходного пути попробуйте использовать bindvalue вместо

...