Php PDO bindParam问题
可能重复:Php PDO bindParam问题,php,mysql,pdo,Php,Mysql,Pdo,可能重复: 我班上有个函数出了点问题。这里是函数 function insert($table,$column = array(),$value = array()) { $array1 = implode(",", $column); $array2 = implode(",", $value); try { $sql = $this->connect->prepare("INSERT INTO :table (:date1)
我班上有个函数出了点问题。这里是函数
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]:无效参数编号:第46行的C:\xampp\htdocs\MYFRAMEWORK\lib\database.class.php中未定义参数
第46行是:
$sql->execute();
所以现在我真的不明白问题在哪里。有指针吗?查询构造不正确,
值
在周围缺少引号
当你进行内爆时
,阵列2看起来像
test1,test,test... //and so on.
它需要是“test1”、“test”、“test”。。。为了在Insert
查询中正确绑定
$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)");
此外,参数名称中有输入错误,date1
而不是data1
,date2
而不是data2
,查询构造不正确,值缺少引号
当你进行内爆时
,阵列2看起来像
test1,test,test... //and so on.
它需要是“test1”、“test”、“test”。。。为了在Insert
查询中正确绑定
$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)");
此外,参数名称中有输入错误,date1
而不是data1
和date2
而不是data2
PDOs绑定值数据,而不是表名和列名。
您误解了绑定的使用。不能用PDO绑定表名和列名。您可以绑定要插入到这些列中的数据。您需要构造SQL以使用字符串操作包含表名和列
格式化数据
我已将$column和$value重命名为$column\u array、$value\u array,以明确它们是什么,并假设它们都是一个简单的数组:$column\u array=array('column1','column2',…)等。
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);
$bindvalues = array_combine($placeholders , $value_array);
$placeholder现在看起来像这样:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
$bindvalues现在看起来如下所示:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
建立、准备、执行
这将为您提供一份准备好的表格声明:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
然后可以执行准备好的语句并将$value作为参数传递
$sql->execute($bindValues);
注:
- 必须提到的一个警告确保原始数据已针对SQL注入进行了清理。PDO会对绑定值进行清理,但如果您是从$\u POST数据构建列,则这是易受攻击的,需要清理
PDOs绑定值数据,而不是表名和列名。
您误解了绑定的使用。不能用PDO绑定表名和列名。您可以绑定要插入到这些列中的数据。您需要构造SQL以使用字符串操作包含表名和列
格式化数据
我已将$column和$value重命名为$column\u array、$value\u array,以明确它们是什么,并假设它们都是一个简单的数组:$column\u array=array('column1','column2',…)等。
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);
$bindvalues = array_combine($placeholders , $value_array);
$placeholder现在看起来像这样:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
$bindvalues现在看起来如下所示:
$placeholders = array(
':column1',
':column2',
...
);
$bindvalues = array(
':column1'=>'value1',
':column2'=>'value2',
...
);
建立、准备、执行
这将为您提供一份准备好的表格声明:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)
然后可以执行准备好的语句并将$value作为参数传递
$sql->execute($bindValues);
注:
- 必须提到的一个警告确保原始数据已针对SQL注入进行了清理。PDO会对绑定值进行清理,但如果您是从$\u POST数据构建列,则这是易受攻击的,需要清理
您构造的查询不正确。请参阅,其中详细说明了如何准确地执行所需操作。您不能绑定标识符,只能绑定值。表名是一个标识符,您需要改为白名单或筛选它。请注意,您构造的查询不正确。请参阅,其中详细说明了如何准确地执行所需操作。您不能绑定标识符,只能绑定值。表名是一个标识符,您需要改为白名单或筛选它。很遗憾,这是不正确的。问题不是由缺少单引号或反勾号引起的。这是由于绑定表和列名而不是值数据。不幸的是,这是不正确的。问题不是由缺少单引号或反勾号引起的。这是由于绑定了表名和列名,而不是值数据。