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_idregistration_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/

10-11 02:53