PDO 重复最后一个绑定参数

PDO repeats last bind param

在迁移到 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]:警告:第 1 行的列 'id_db' 的 1265 数据被截断 什么都没有插入。查看日志:

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 中无效。 我该如何解决?或者一些解决方法?

...和 ​​it failed 稍微早一点。

您正在通过引用绑定参数,并使用相同的变量 $value 绑定所有参数。我很惊讶它以前有效。假设 PHP 5.6 和 7.2

之间有一些与 references/variables 相关的变化

解决方法是尝试使用 bindvalue