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