首页 > 解决方案 > MySql Invalid parameter number:绑定变量数与token数不匹配

问题描述

我遇到了一个我不明白的奇怪错误,我尝试了所有方法但没有任何效果,这是我的要求:

public function displayFirstEvents_indexed($start, $limit)
    {
        $query = $this->connect()->prepare(
            "SELECT *
            FROM t_event join t_type_event using(tte_id)
            WHERE eve_active = :active AND tte_lib = :lib
            ORDER BY eve_date DESC
            LIMIT :start, :limit;"
        );
        $query->bindParam(':start', $start, PDO::PARAM_INT);
        $query->bindParam(':limit', $limit, PDO::PARAM_INT);
        $query->execute([':active' => 'yes', ':lib' => 'first']);
        return $query;
    }

这是错误

    <br />
<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\xampp\htdocs\UFTAM WEBSITE API\classes\event.c.php:105
Stack trace:
#0 C:\xampp\htdocs\UFTAM WEBSITE API\classes\event.c.php(105): PDOStatement-&gt;execute(Array)
#1 C:\xampp\htdocs\UFTAM WEBSITE API\handers\events\displayFirstEvents_indexed.php(7): Event-&gt;displayFirstEvents_indexed('1', '4')
#2 {main}
  thrown in <b>C:\xampp\htdocs\UFTAM WEBSITE API\classes\event.c.php</b> on line <b>105</b><br />

我尝试用 '?' 替换 ':active' 和 ':lib' 但它给了我同样的错误,有没有人知道这个的解决方案?

我怀疑这里的问题出在 Where close 我认为我不能将 'where' 与 'limit' 一起使用 我一直在研究它,但我没有找到任何同时使用 'where' 和 'limit' 的例子,有人认为这是真的吗?

标签: phpmysql

解决方案


10 年前我在 php.net 上发现的一条注释:

请注意,您必须

  • 要么将所有值在数组中绑定到 PDOStatement::execute()
  • 或者使用 PDOStatement::bindValue() 绑定之前的每个值,然后带参数调用 PDOStatement::execute()(甚至不是“array()”!)。将数组(无论是否为空)传递给 execute() 将“擦除”并替换任何以前的绑定(并且可能导致,例如使用 MySQL,如果您传递了一个空,则“SQLSTATE [HY000]:一般错误:2031”(CR_PARAMS_NOT_BOUND)大批)。

https://www.php.net/manual/en/pdostatement.execute.php

尽管这可能令人沮丧(因为为什么不!?),但在使用 PDO 时不能混合使用“绑定”和“执行”。正在删除您的两个参数。要么在执行中传递令牌,要么先将它们全部绑定。(我可能会先按顺序绑定它们。)

$query->bindValue(':active', 'yes', PDO::PARAM_STR);
$query->bindValue(':lib', $colour, PDO::PARAM_STR);
$query->bindValue(':start', $start, PDO::PARAM_INT);
$query->bindValue(':limit', 'first', PDO::PARAM_INT);
$query->execute();

如果绑定不起作用,请尝试将它们放入execute()中。如果您这样做,请注意 PHP PDO 明显的限制问题。

https://phpdelusions.net/pdo#limit


推荐阅读