从下面的准备好的声明中解决 SQLSTATE[HY093]: Invalid parameter number
问题。
我发现 $stmt->bindValue
存在问题。
准备好的声明& BindValue - 1
$stmt = $conn->prepare(
'SELECT *
FROM `gcm_notification` t1
RIGHT JOIN (
SELECT MAX(`id`) AS `latest`
FROM `gcm_notification`
WHERE `registration_id` = :registration_id
GROUP BY `post_id`) t2
ON `t1`.`id` = `t2`.`latest`
LEFT JOIN `posts` t3 ON `t1`.post_id = `t3`.ID
WHERE `registration_id` = :registration_id
GROUP BY `post_id`'
);
$stmt->bindValue(':registration_id', $registration_id, PDO::PARAM_STR);
$stmt->execute();
结果
SQLSTATE[HY093]: Invalid parameter number
准备好的声明& BindValue - 2
$stmt = $conn->prepare(
'SELECT *
FROM `gcm_notification` t1
RIGHT JOIN (
SELECT MAX(`id`) AS `latest`
FROM `gcm_notification`
WHERE `registration_id` = :registration_id
GROUP BY `post_id`) t2
ON `t1`.`id` = `t2`.`latest`
LEFT JOIN `posts` t3 ON `t1`.post_id = `t3`.ID
WHERE `registration_id` = :registration_id
GROUP BY `post_id`'
);
$stmt->bindValue(':registration_id', $registration_id, PDO::PARAM_STR);
$stmt->bindValue(':registration_id', $registration_id, PDO::PARAM_STR);
$stmt->execute();
结果
SQLSTATE[HY000]: General error: 2031
准备好的声明& BindValue - 3
$stmt = $conn->prepare(
'SELECT *
FROM `gcm_notification` t1
RIGHT JOIN (
SELECT MAX(`id`) AS `latest`
FROM `gcm_notification`
WHERE `registration_id` = :registration_id
GROUP BY `post_id`) t2
ON `t1`.`id` = `t2`.`latest`
LEFT JOIN `posts` t3 ON `t1`.post_id = `t3`.ID
WHERE `registration_id` = :registration_id_1
GROUP BY `post_id`'
);
$stmt->bindValue(':registration_id', $registration_id, PDO::PARAM_STR);
$stmt->bindValue(':registration_id_1', $registration_id, PDO::PARAM_STR);
$stmt->execute();
结果
SUCCESS
我不明白为什么准备好的声明& BindValue - 1 不起作用。 bindValue
无法绑定2个:registration_id
的相同参数?
所以,我认为我对第一点的假设是正确的,我复制并粘贴另一个bindValue
并尝试哪个准备好的声明& BindValue - 2 。结果再次失败。
我认为可能是因为参数出现了冲突。因此,我创建了将参数重命名为registration_id
和registration_id_1
,这是准备好的声明& BindValue - 3 ,它正在运作。
有人会介意向我解释实际发生的事情吗?
谢谢你,并且非常了解。
答案 0 :(得分:0)
感谢 @Jon Stirling ,
阅读PHP Manual上的评论后。
引自 william dot clarke at gmail dot com
当然,如果你想以你应该使用的方式使用预备语句 第二个例子中的语法:
例如。
代替:select id,name from demo_de where name LIKE:name OR name =:name
使用:从demo_de中选择id,名称LIKE?或者姓名=?
我相信你应该使用不同的命名参数 (name,name1)或匿名参数(?s)
他在9年前回答了我的问题。
希望这篇文章能帮助那些正在寻找答案的人。