Для примера у меня есть следующий код:
$dbStatement=$this->dbObject->prepare("SELECT AVG(quality) as quality, AVG(adequacy) as adequacy, AVG(friendliness) as friendliness, SUM(overall) as overall, SUM(completed) as completed, type FROM (SELECT AVG(quality) as quality, AVG(adequacy) as adequacy, AVG(friendliness) as friendliness, COUNT(id) as overall, SUM(is_completed) as completed, category_id, type FROM valuation a WHERE status =1 AND type =:01 AND ((type='employer' AND owner_id=:02) OR (type='employee' AND winner_id=:02)) GROUP BY category_id HAVING COUNT(id)<=:03) b GROUP BY type"); $dbStatement->bindParam(':01',$Type); $dbStatement->bindParam(':02',$UserID); $dbStatement->bindParam(':03',$Most); $dbStatement->execute();
Этот код генерирует исключение из execute()
когда я устанавливаю PDO::ATTR_EMULATE_PREPARES
в FALSE
. В объект исключения включено следующее сообщение:
SQLSTATE [HY093]: недопустимый номер параметра
Пока не удалось решить проблему, хотя прочитайте соответствующие руководства.
Ошибка связана с повторением заполнитель . Каждый заполнитель должен быть уникальным, даже если вы привязываете к нему один и тот же параметр.
AND ((type='employer' AND owner_id=:02) OR (type='employee' AND winner_id=:02))
Должно быть:
AND ((type='employer' AND owner_id=:02) OR (type='employee' AND winner_id=:another02))
И затем привязывайтесь к нему:
$dbStatement->bindParam(':01',$Type); $dbStatement->bindParam(':02',$UserID); $dbStatement->bindParam(':another02',$UserID); $dbStatement->bindParam(':03',$Most);