0

可能重复:
PHP PDO 语句可以接受表名作为参数吗?

我的班级中有一个函数正在做一些麻烦。这里的功能

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 was not defined in C:\xampp\htdocs\MYFRAMEWORK\lib\database.class.php on line 46

第 46 行是:

$sql->execute();

所以现在我真的不明白问题出在哪里。任何指针?

4

2 回答 2

5

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 数据构建列,这很容易受到攻击,需要进行清理。
于 2012-11-15T21:32:10.230 回答
0

查询构造不正确,values缺少周围的'引号。

当您执行 时implode,array2 看起来像,

 test1,test,test... //and so on.

它需要是 'test1','test','test'...才能在Insert查询中正确绑定。

$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)"); 

此外,您在参数名称中有拼写错误,date1而不是data1date2而不是data2.

于 2012-11-15T20:17:15.870 回答