MySql 参数编号无效:绑定变量数与令牌数不匹配



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

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:xampphtdocsUFTAM WEBSITE APIclassesevent.c.php:105
Stack trace:
#0 C:xampphtdocsUFTAM WEBSITE APIclassesevent.c.php(105): PDOStatement-&gt;execute(Array)
#1 C:xampphtdocsUFTAM WEBSITE APIhanderseventsdisplayFirstEvents_indexed.php(7): Event-&gt;displayFirstEvents_indexed('1', '4')
#2 {main}
thrown in <b>C:xampphtdocsUFTAM WEBSITE APIclassesevent.c.php</b> on line <b>105</b><br />

我尝试将":active"和":lib"替换为"?",但它给了我同样的错误,有人知道解决方案吗?

我怀疑这里的问题出在"哪里",我认为我不能将"哪里"与"限制">

一起使用,我一直在研究它,但我还没有找到任何将"哪里"和"限制"一起使用的例子,有人认为这是真的吗?

我在 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();

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

https://phpdelusions.net/pdo#limit

mysql 命令的顺序是错误的,ORDER BY 在 WHERE 子句后面

$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;"
);
$sth->bindValue(':active', 'yes', PDO::PARAM_STR);
$sth->bindValue(':lib', 'first', PDO::PARAM_STR);
$sth->bindValue(':limit', $limit, PDO::PARAM_INT);
$sth->bindValue(':start', $start, PDO::PARAM_INT);
$query->execute();

并在执行前绑定所有 4 个变量。

最新更新