php - PHP PDO 动态查询构建器类
问题描述
我正在编写一个类来生成动态 SQL 插入查询。如果我还考虑作为自动增量值的 id ,那么我创建了一个包含七列的测试表,否则这些值只有六列。我试图测试我编写的插入函数是否有效,但控制台向我记录了一个关于有界变量数量的错误:PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
. 通常我用来编写查询,这是我第一次收到此错误。是否有可能我还需要在查询中包含 id 列字段?这是代码:
测试页面
<?php
$dataManager = new DataManager($db);
$table = 'hats_info';
$data = array('test0','test1','test2','test3','test4','test5');
$columns = array('materialA','materialB','materialC','materialD','accessories','hat_image');
$holders = array('?','?','?','?','?','?');
echo $dataManager->insert($data, $table, $columns, $holders);
?>
类方法代码
<?php
public function insert($table, array $data, array $columns , array $holders){
$columns = implode(', ', array_values($columns));
$holders = implode(', ', array_values($holders));
$values = implode(', ', array_values($data));
$stmt = $this->db->prepare("INSERT INTO $table ($columns) VALUES ($holders)");
return $stmt->execute(array($values));
}
?>
解决方案
我通过以下方式完成了这样的功能:
$table = 'hats_info';
$data = [
'materialA' => 'test0',
'materialB' => 'test1',
'materialC' => 'test2',
'materialD' => 'test3',
'accessories' => 'test4',
'hat_image' => 'test5'
];
echo $dataManager->insert($table, $data);
public function insert($table, array $data) {
$columns_delimited = implode(', ' array_map(
function ($column) { return "`$column`"; },
array_keys($data)
));
$placeholders = implode(', ', array_fill(1, count($data), '?'));
$sql = "INSERT INTO `$table` ($columns_delimited) VALUES ($placeholders)"
$stmt = $this->db->prepare($sql);
return $stmt->execute(array_values($data));
}
推荐阅读
- javascript - 错误:他可能是因为文本被测试库中的多个元素分解
- crystal-reports - 将签名 Blob 添加到 Crystal Report 表单
- azure-synapse - 如何使用 Azure Synapse Serverless SQL 池在 Azure Data Lake Gen2 中创建空白的“Delta”湖表架构?
- c# - ASP.NET MVC C# Google Drive API 重定向不匹配 URI
- python - 在python中动态访问列表项
- python - 如何使用我的 python 包发布我的单元测试
- node.js - 多个 URL(UI 页面和 API)的 Nginx 位置正则表达式?
- pandas - 了解 Pandas 系列数据结构
- android - 无法解决这个错误?Kotlin(二维码阅读器)
- python - MetPy 0.12->1.1 升级后从 THREDDS 服务器创建卫星图像时出错