После устранения неполадок 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 и он работает.
Неужели кто-то возражает, чтобы объяснить мне, что на самом деле происходит?
Благодарим вас и много.
Ожидается, что поведение будет задокументировано. Просто вы не можете иметь несколько заполнителей с тем же именем (и эмуляция должна быть отключена, когда это возможно, imo). [Документы] (http://php.net/manual/en/pdo.prepare.php). –
@JonStirling, Спасибо! – WeeHong