PDO重复最后一个绑定参数

时间:2018-06-10 21:46:23

标签: php pdo php-7.2

在转向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中不起作用。 我该怎么办呢?或者一些解决方法?

1 个答案:

答案 0 :(得分:0)

...和it failed稍久以前。

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

作为一种解决方法,请尝试使用bindvalue代替