对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
我不明白为什么“ Prepared Statement&BindValue-1”不起作用。
bindValue
不能绑定两个相同的参数,即:registration_id
?因此,我假设关于第一点的假设是正确的,然后复制并粘贴另一个
bindValue
并尝试使用Prepared Statement&BindValue-2。结果再次失败。我认为可能是因为参数冲突。因此,我将参数重命名为
registration_id
和registration_id_1
,它们是Prepared Statement&BindValue-3,并且可以正常工作。有人介意向我解释实际情况吗?
谢谢,非常感谢。
最佳答案
感谢@Jon Stirling,
在阅读了关于PHP Manual的评论后。
gmail dot com的William dot clarke的报价
当然,如果您想以这种方式使用准备好的语句
第二个示例中的语法:
例如。
而不是:从demo_de中选择id,name,其中name LIKE:name OR
名称=:名称
使用:从demo_de中选择id,name,其中name喜欢?或名称=?
我相信您应该使用不同的命名参数
(名称,名称1)或匿名参数(?s)
他大约9年前回答了我的问题。
希望这篇文章对寻求答案的人有所帮助。
关于php - PDOStatement::bindValue- SQLSTATE [HY093]:无效的参数号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36909605/