首页 > 解决方案 > PDO 重复最后一个绑定参数

问题描述

在迁移到 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 第 1 行的列 'id_db' 的数据被截断 没有插入任何内容。查看日志:

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

标签: phppdophp-7.2

解决方案


...而且它在更早之前失败了。

您通过引用绑定参数并使用相同的变量$value来绑定所有参数。我很惊讶它以前有效。假设 PHP 5.6 和 7.2 之间有一些与引用/变量相关的更改

作为一种解决方法,请尝试改用bindvalue


推荐阅读