php - 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 中无效。我该如何解决?或者一些解决方法?
解决方案
推荐阅读
- ios - Iphone x 及更高版本的安全区域内的图像选择器 cameraoverlay 无法正常工作
- kubernetes - 无头服务在 Kubernetes 中是否“原子”更新?
- google-cloud-platform - 使用 n2-standard-2 机器类型运行数据流作业,数据流作业是否可以随时仅使用 2 个 vCPU 运行,或者它可以自动扩展到配额限制
- c++ - 子类运算符 << 重载 C++
- shapley - shapley-values 如何解释我的模型中没有特征?
- amazon-web-services - 如何使用 Java SDK 和 SSO 向 AWS 进行身份验证
- laravel - 如何在 LARAVEL 中编辑搜索表单的占位符
- postgresql - 在插入PostgreSQL之前剪切一列的内容
- json - 如何使用 React 在资源(.json、.csv 等)上使用代码拆分
- laravel - 提交的表单在 laravel 中检测到一个空对象请求