Неверный номер параметра: количество связанных переменных не соответствует количеству токенов - PullRequest
2 голосов
/ 28 января 2010

У меня есть таблица: «объекты» с несколькими столбцами: object_id: int, object_type: int, object_status: int, object_lati: float, object_long: float Мой запрос:

$stmt = $db->query('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
$res = $stmt->fetch();

PDO выдает ошибку:

SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов

Когда я удаляю столбец object_lati или object_long, запрос работает нормально.

Ответы [ 3 ]

1 голос
/ 17 октября 2015

Хотя этот конкретный вопрос не является реальным, поскольку предоставленный код никогда не выдаст такую ​​ошибку, похоже, что Google с удовольствием отправляет посетителей на эту страницу. Для кого следующий ответ:

Эта проблема никогда не может быть вызвана вызовом метода query(), так как он по существу принадлежит подготовленному оператору.

Сама ошибка довольно ясна: «число токенов» означает количество ? или :name токенов в запросе (которое также называется «заполнителями»), а «число связанных переменных» обозначает переменные, которые были связаны эфиром через bindValue или `bindParam, или отправлены через execute (что технически совпадает). Таким образом, когда кто-то пытается связать больше переменных, чем было определено в запросе токенов, PDO вызывает эту ошибку.

Например, если есть запрос, подготовленный без определенных токенов, но мы пытаемся привязать к нему переменную:

$stmt = $db->prepare('SELECT * FROM objects o WHERE o.object_id = 1');
$stmt->execute(array($id));

тогда это приведет к тому же самому сообщению об ошибке, так как число связанных переменных (1) не соответствует количеству токенов (0).

Чтобы решить эту проблему, нужно просто сравнить количество токенов в подготовленном запросе с количеством переменных, которые были связаны с оператором.

0 голосов
/ 27 февраля 2013

попробуйте вместо этого

$row = $db->fetchRow('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
// return false if no result found

или получить набор записей

$rs = $db->fetchAll('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
// returns array with results
0 голосов
/ 28 января 2010

Попробуйте выражение как:

$stmt = $db->query('SELECT object_id, object_type, object_status, object_lati, object_long FROM objects o WHERE object_id = ? ', 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...