Спасибо, полное сообщение об ошибке тоже очень важно, но я имел в виду полный пример кода, который приводит к этой ошибке. Кода, который можно выполнить.
Тот код, который у тебя в вопросе, никаких ошибок не выдает.
Pardon Me! Where Do I Find 4giveness?, камон. Это же поколение Х, дети, воспитанные ютубой.
Он в принципе не в состоянии воспринимать печатный текст кроме как в виде надписи на картинке.
Контроллер - не единственная точка входа в приложение.
И к SQL инъекциям отношения не имеет. Разнесение валидации и исполнения запроса - это прямая дорога к инъекции.
Составлять запрос должен метод дата маппера (который неправильно называют моделью) и следить за безопасностью должен тоже он. При этом никто не мешает использовать унифицированные методы в мапперах. Вот пример такого класса.
При этом полностью универсальный метод, в который можно подставлять любые данные из любого класса - это головотяптсво и лень, которые доведут до больших неприятностей.
Чтобы избежать инъекций, в запросе не должно быть внешних данных.
Идея в том, чтобы плейсхолдеры (:name) писались программистом, руками, в коде программы.
А если они попадают в запрос извне, то это та же самая инъекция. Ну просто она будет не в данных, а в именах плейсхолдеров, а так всё то же самое.
Если составлять запрос динамически, то имена полей все равно должны быть заранее прописаны в скрипте. Например - в свойствах класса, если это класс.