【问题标题】:Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: Columns/Parameters are 1-based警告:PDOStatement::bindValue(): SQLSTATE[HY093]:无效的参数号:列/参数从 1 开始
【发布时间】:2015-01-24 10:40:11
【问题描述】:

我正在尝试创建一个 query 函数,如下所示:

public function Query( $sql, $params = array() ) {
        $this->error = false;

        if ( $this->query = $this->pdo->prepare( $sql ) ) {
            for ( $i = 0, $size = count( $params ); $i < $size; $i ++ ) {
                echo $i;
                $this->query->bindValue( $i, $params[ $i ] );
            }

            if ( $this->query->execute() ) {
                echo 'suc';
            }
        }
    }

然后这样称呼它:

$mysql->Query( "SELECT * FROM `client_info` WHERE `name` = ? AND `password`= ?", array(
    'test',
    'test'
) );

结果是:

Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: Columns/Parameters are 1-based

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

我不知道这里出了什么问题,一切都应该没问题,它应该可以工作!!

【问题讨论】:

  • 试试这个 for 循环:for ( $i = 1, $size = count( $params ); $i &lt;= $size; $i ++ ) { echo $i; $this-&gt;query-&gt;bindValue( $i, $params[ $i-1 ] ); } 这对你有用吗?
  • 我通过 bindValue( $i + 1, $params[ $i ] ); 修复了它,没有改变循环中的任何内容,同样的事情!
  • 你是对的!更好的解决方案很好:D

标签: php mysql pdo


【解决方案1】:
 $i = 0

警告:PDOStatement::bindValue(): SQLSTATE[HY093]:无效参数号:列/参数是从 1 开始的

比较这两件事,您会注意到您的$i 必须从 1 开始,而不是 0。

这也可以通过PHP Manual确认

参数

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

【讨论】:

  • 非常好的解释 :D 如果你愿意,你可以复制 for 循环它应该是怎样的:stackoverflow.com/questions/28124598/… 循环从 1 开始,数组访问只需减去 1。(顺便说一句:你有1 个空格 $i = 0)
【解决方案2】:

当你做一些简单的事情时,你也会遇到这个问题,比如有一个混乱的抽象函数,当它应该是一个字符串时,你最终将一个数组传递给了 bindValue(),如下所示:

$a = array(':slug','mickey1');
$st = $PDO->prepare($sSQL);
$st->bindValue(':slug',$a); // the bug!

就我而言,我应该将$a 设为array(':slug' =&gt; 'mickey1') 并且应该迭代我的数组,以便我可以通过关联数组的每个字符串键bindValue()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多