2016-04-28 2 views
1

После устранения неполадок SQLSTATE[HY093]: Invalid parameter number из подготовленного заявления ниже.
Я нашел, что есть проблема о $stmt->bindValue.PDOStatement :: bindValue- SQLSTATE [HY093]: Неверный номер параметра


Подготовленные Заявление & 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 и он работает.

Неужели кто-то возражает, чтобы объяснить мне, что на самом деле происходит?

Благодарим вас и много.

+3

Ожидается, что поведение будет задокументировано. Просто вы не можете иметь несколько заполнителей с тем же именем (и эмуляция должна быть отключена, когда это возможно, imo). [Документы] (http://php.net/manual/en/pdo.prepare.php). –

+0

@JonStirling, Спасибо! – WeeHong

ответ

0

Благодаря Стирлингу @ Джон,

После прочтения этих комментариев на PHP Manual.

Цитата УИЛЬЯМ кларку точка на GMAIL точка ком

Конечно, если вы хотите использовать подготовленные заявления, таким образом, вы должны использовать синтаксис во втором примере:

например.

вместо: выберите идентификатор, название от demo_de где имя LIKE: Имя или имя =: Имя

использование: выберите идентификатор, название от demo_de где имя LIKE? ИЛИ имя =?

Я считаю, что вы должны либо использовать различные именованные параметры (имя, name1) ИЛИ анонимные параметры (? Ы)

Он ответил на мой вопрос о 9 лет назад.

Надеюсь, что это сообщение поможет кому-то, кто ищет ответа.

Смежные вопросы