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数据构建列,则这是易受攻击的,需要清理

您构造的查询不正确。请参阅,其中详细说明了如何准确地执行所需操作。您不能绑定标识符,只能绑定值。表名是一个标识符,您需要改为白名单或筛选它。请注意,您构造的查询不正确。请参阅,其中详细说明了如何准确地执行所需操作。您不能绑定标识符,只能绑定值。表名是一个标识符,您需要改为白名单或筛选它。很遗憾,这是不正确的。问题不是由缺少单引号或反勾号引起的。这是由于绑定表和列名而不是值数据。不幸的是,这是不正确的。问题不是由缺少单引号或反勾号引起的。这是由于绑定了表名和列名,而不是值数据。