首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO bindParam问题

PDO bindParam问题
EN

Stack Overflow用户
提问于 2012-11-15 20:12:30
回答 2查看 3K关注 0票数 0

可能重复: Can PHP PDO Statements accept the table name as parameter?

我在班上有一个函数,它在做一些麻烦。这里的功能

代码语言:javascript
复制
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();  
    }  
}

我称该职能为:

代码语言:javascript
复制
-> insert('coupons',array('categorie','name','link','code','id'),array('test11','test','test','test','NULL'));

我得到的错误是:

警告:在第46行的C:\xampp\htdocs\MYFRAMEWORK\lib\database.class.php中没有定义PDOStatement::execute() pdostatement.execute: SQLSTATEHY093:无效的参数号:参数

第46行是:

代码语言:javascript
复制
$sql->execute();

所以现在我不太明白问题出在哪里。有什么指示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-15 21:32:10

PDO绑定值数据,而不是表名和列名。

你误解了绑定的使用。不能将表名和列名与PDO绑定。将数据绑定到这些列中。您需要构造SQL以包含使用字符串操作的表名和列。

格式化数据

我将您的$column和$value重命名为$column_array,$value_array,以明确它们是什么,并假设每个数组都是一个简单的数组:$column_array = array('column1', 'column2', ...) etc.

代码语言:javascript
复制
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);

$bindvalues = array_combine($placeholders , $value_array);

$placeholders现在看起来如下所示:

代码语言:javascript
复制
$placeholders = array(
        ':column1',
        ':column2',
         ...
    );

$bindvalues现在看起来如下所示:

代码语言:javascript
复制
$bindvalues = array(
        ':column1'=>'value1',
        ':column2'=>'value2',
         ...
    );

建造,准备,执行

代码语言:javascript
复制
$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";

这将为您提供一份准备好的表格说明:

代码语言:javascript
复制
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)

然后,您可以执行准备好的语句,并将$values作为参数传递。

代码语言:javascript
复制
$sql->execute($bindValues);

注意:

  • 一个必须提到的警告。确保您的原始数据已经针对constructing进行了清理。PDO负责绑定值的处理,但是如果您是从(比方说) $_POST数据构建列,则这是脆弱的,需要进行清理。
票数 5
EN

Stack Overflow用户

发布于 2012-11-15 20:17:15

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

当你做implode时,array2看起来像,

代码语言:javascript
复制
 test1,test,test... //and so on.

它需要是‘test 1’,'test',‘test’.以便在Insert查询中正确绑定。

代码语言:javascript
复制
$sql = $this->connect->prepare("INSERT INTO :table (:date1) VALUES (:date2)"); 

另外,您还可以在参数名称中输入date1而不是data1date2而不是data2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13405392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档