php - 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->execute(Array)
#1 C:\xampp\htdocs\UFTAM WEBSITE API\handers\events\displayFirstEvents_indexed.php(7): Event->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' 的例子,有人认为这是真的吗?
解决方案
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 明显的限制问题。
推荐阅读
- python - 无法使用opencv从图像制作视频
- shopify - 在 Unbounce 上的 shopify 登陆页面,这将允许访问者将产品添加到购物车
- python - 使用 NLTK Python 对推文进行分类
- python - Python,Pandas:如何根据开始时间和结束时间对数据帧的行进行分组
- r - 根据最接近的时间戳将两个数据帧与 R 中的几列连接起来
- sql - 预期获得的 CLOB 数据类型
- c# - C# - Reflection.Emit:返回对局部变量的引用
- for-loop - CMD 脚本:在“for”循环中未正确评估变量
- apache - 将 htaccess RewriteCond 转换为 web.config
- java - 设置 namespacePrefixMapper 定义前缀映射时的 Jaxb 属性异常