Invalid parameter number: number of bound variables does not match number of tokens


В принципе, ошибка сама по себе простая. Давайте разберем ее подробно:
"number of tokens" - это количество токенов (т.е. плейсхолдеров, ? или :name) в подготовленном запросе.
"number of variables bound" - количество переменных, которые мы привязали к запросу, либо через bindValue или bindParam, либо отправили прямиком в execute (что технически то же самое).
"does not match number of tokens" - количество токенов не совпадает с количеством переменных!

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

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

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


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

Соответственно, чтобы решить эту проблему, надо тщательно пересчитать все плейсхолдеры и соответствующие им переменные. Также надо помнить, что плейсхолдеры нельзя брать в кавычки - такой плейсхолдер ПДО не засчитает, и выдаст ту же самую ошибку.