Хотя этот конкретный вопрос не является реальным, поскольку предоставленный код никогда не выдаст такую ошибку, похоже, что 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).
Чтобы решить эту проблему, нужно просто сравнить количество токенов в подготовленном запросе с количеством переменных, которые были связаны с оператором.