PDO bindParam问题[重复]
Posted
技术标签:
【中文标题】PDO bindParam问题[重复]【英文标题】:PDO bindParam issue [duplicate] 【发布时间】:2012-11-04 12:25:07 【问题描述】:可能重复:Can php PDO Statements accept the table name as parameter?
我的班级中有一个函数正在做一些麻烦。这里的功能
function insert($table,$column = array(),$value = array())
$array1 = implode(",", $column);
$array2 = implode(",", $value);
try
$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)");
$sql->bindParam(':table',$table, PDO::PARAM_STR);
$sql->bindParam(':data1',$array1, PDO::PARAM_STR);
$sql->bindParam(':data2',$array2, PDO::PARAM_STR);
$sql->execute();
catch(PDOException $e)
echo $e->getMessage();
我调用函数:
-> insert('coupons',array('categorie','name','link','code','id'),array('test11','test','test','test','NULL'));
我得到的错误是:
警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter is not defined in C:\xampp\htdocs\MYFRAMEWORK\lib\database.class.php on line 46
第 46 行是:
$sql->execute();
所以现在我真的不明白问题出在哪里。有什么指点吗?
【问题讨论】:
您构建的查询不正确。请参阅this question,其中详细说明了如何完全按照您的要求进行操作。 你不能绑定标识符,只能绑定值。表名是一个标识符,您需要将其列入白名单或过滤它。见***.com/a/8255054/345031 【参考方案1】:PDO 绑定值数据,而不是表名和列名。
您误解了绑定的使用。您不能将表名和列名与 PDO 绑定。您绑定数据以插入这些列。您需要使用字符串操作构造 SQL 以包含表名和列。
格式化数据
我已将您的 $column 和 $value 重命名为 $column_array, $value_array 以明确它们是什么,并假设每个都是一个简单的数组:$column_array = array('column1', 'column2', ...) etc.
$placeholders = array_map(function($col) return ":$col"; , $column_array);
$bindvalues = array_combine($placeholders , $value_array);
$placeholders 现在看起来像这样:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues 现在看起来像这样:
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
构建、准备、执行
$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";
这将为您提供一份准备好的表格声明:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
然后您可以执行准备好的语句并将 $values 作为参数传递。
$sql->execute($bindValues);
注意:
必须提到一个警告。 确保您的原始数据已针对 SQL 注入进行了清理。 PDO 负责处理绑定值,但如果您从 $_POST 数据构造列,这很容易受到攻击,需要进行消毒。【讨论】:
【参考方案2】:查询构造不正确,values
周围缺少 '
引号。
当您执行implode
时,array2 看起来像,
test1,test,test... //and so on.
它必须是 'test1','test','test'...才能正确绑定到 Insert
查询中。
$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)");
此外,您的参数名称中有拼写错误,date1
而不是 data1
和 date2
而不是 data2
。
【讨论】:
很遗憾,这是不正确的。该问题不是由缺少单引号或反引号引起的。这是由于绑定了表名和列名而不是值数据。以上是关于PDO bindParam问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章
用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]
PDO->bindParam、PDO->bindValue 和 PDO->closeCursor
PHP PDO::bindParam() 数据类型.. 它是如何工作的?