【问题标题】:PHP - PDO Prepared statment, "Warning: PDOStatement::bindParam() expects at least 2 parameters"PHP - PDO Prepared 语句,“警告:PDOStatement::bindParam() 至少需要 2 个参数”
【发布时间】:2017-05-01 10:22:42
【问题描述】:

我正在尝试使用准备好的语句来设置占位符值,该值使用作为参数传递给 __construct 函数的类对象属性。但是,当我只有一个参数作为占位符值时,我会收到一个错误,指定需要 2 个参数。

代码:

<?php include ('connection.inc.php');

class Team {

    // Remember to switch back to private!
    private $database;
    public $statement = 'SELECT * FROM members ORDER BY :full_name';
    public $order;
    public $query;

    private $result;    

    public function __construct($database, $order) {
        $this->database = $database;
        $this->order = $order;
        $this->query = $this->database->prepare($this->statement);
        $this->query->bindParam(array('full_name', $this->order));
        $this->query->execute();                
    }

    public function getMember() {        
        $this->result = $this->query->fetch(PDO::FETCH_ASSOC);
        return $this->result;                        
    }
    public function id() {
        echo $this->result['id'];
    }

    public function fullName() {
        echo $this->result['full_name'];
    }
    public function alias() {
        echo $this->result['alias'];
    }
    public function abilities() {
        echo $this->result['abilities'];
    }    

};

$test = new Team($database, 'full_name');

?>

错误:

警告:PDOStatement::bindParam() 至少需要 2 个参数,其中 1 个给出

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE[HY093]:无效参数号:未绑定参数”

解决方案

感谢@Daerik,我将我的bindParam() 语句更改为:

$this->query->bindParam(':full_name', $this->order));

这消除了错误。

【问题讨论】:

    标签: php pdo prepared-statement execute bindparam


    【解决方案1】:

    PDOStatement::bindParam (混合 $parameter , 混合 &$variable )

    $parameter:参数标识符。对于使用命名占位符的准备好的语句,这将是一个形式为 :name 的参数名称。对于使用问号占位符的预处理语句,这将是参数的 1 索引位置。

    $variable:要绑定到 SQL 语句参数的 PHP 变量的名称。

    你会想要使用:

    $this->query->bindParam(':full_name', $this->order);
    

    更多信息请阅读PDOStatement::bindParam

    【讨论】:

    • 谢谢,这消除了两个错误和。但是,当使用gettMember() 方法迭代sql 查询时,它会忽略我的ORDER BY ':full_name' 语句并使用id 列对条目进行排序。这是我准备好的陈述中的错误吗?
    • @FrederickM.Rogers 您需要在ORDER BY 语句中使用一列。分配一个字符串会将它们全部与相同的值进行比较,并默认为索引。阅读dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html了解更多信息。
    • 感谢您通读并做出必要的调整!
    • 经过一番阅读后,我发现我传递给占位符的字符串实际上是列的名称。这是错的吗?
    • @FrederickM.Rogers 这是正确的。占位符用于值而不是列。
    【解决方案2】:

    不要使用bindParam()传递多个参数,直接使用:

    $this->query->execute(array(':full_name' => $this->order));
    

    注意:您需要在参数名称中包含:,并且您需要传递':key' =&gt; $value 对。

    或者只有一个,不要传递数组,bindParam() 需要两个参数:

    $this->query->bindParam(':full_name', $this->order);
    

    【讨论】:

    • 使用PDOStatement::execute时不必包含:
    • @Daerik:从未尝试过,所有手动示例都显示:parameter,而且input_parameters 中的键必须与SQL 中声明的键匹配。,但有可能.
    • SQL 语句中需要使用冒号,以指示哪些标识符是占位符。 execute() 调用中的冒号是可选的。文档指定了它们,但实现足够聪明,可以弄清楚如果你把它们排除在外,你的意思是什么。
    • @Daerik 您写道“execute() 调用中的冒号是可选的。” - 在一些非常罕见的情况下,绑定中需要冒号。但是,在您的回答中,您似乎与您的评论相矛盾。我最初看到这个问题,并打算建议它们包括冒号,但我没有,因为我不认为这是问题,一次又一次;需要使用冒号的情况非常罕见,甚至根据这个答案stackoverflow.com/a/9778890/1415724 记录了github.com/php/php-src/blob/PHP-5.3.24/ext/pdo/pdo_stmt.c#L363 真正的问题是使用array
    • @Fred-ii- 感谢您提供的文档。在我回答这个问题时,我只是通过手册来回答这个问题,因为根据我的经验,我更喜欢execute()。直到后来,在寻找支持我的主张的资源后,我才明白它也适用于 bindParam()。编辑答案以反映对另一个答案的评论毫无意义。我想知道该行为是否不受官方支持,为什么它会在缺少时添加:
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2013-10-09
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多