Помилка invalid parameter number parameter was not defined ()


Ця помилка сигналізує про проблеми з плейсхолдерамі. Під словом parameter тут мається на увазі саме він. Тобто, "parameter was not defined" означає, що ми намагаємося прив'язати до запиту плейсхолдер, якого в ньому немає.

Наприклад, ми визначили в запиті плейсхолдер, але помилилися при його написанні його імені в масиві:

$ Stmt = $ db -> prepare ( 'UPDATE t SET name =. WHERE id =: name');
$ Stmt -> execute ([ 'mane' => $ name. 'Id' => $ id]));

PDO спробує знайти в запиті плейсхолдер з ім'ям 'mane', не знайде його, і видасть цю саму помилку!

До речі, всупереч поширеній помилці, наявність двокрапки в індексі масиву зовсім не обов'язково і причиною помилки бути не може.

При виправленні цієї помилки слід звернути увагу на наступні проблеми:

1. Найпоширеніша: користувач за звичкою бере плейсхолдери в лапки. Цього робити ні в якому разі не можна - ПДО прийме їх за звичайні рядки, і в результаті не знайде в запиті жодного плейсхолдера.

2. Теж вельми часта причина: помилки в іменованих плейсхолдерах. Скажімо, в запиті user_name, а в переданих даних - username. Також слід пам'ятати що імена плейсхолдеров чутливі до регістру.

3. Схожа на попередню помилка: ви просто забули записати в запиті плейсхолдер, для якого передаєте дані. Треба уважно перебрати всі передані дані, і відповідні їм плейсхолдери.

4. Також слід пам'ятати, що для імен плейсхолдеров підтримуються тільки латинські букви, цифри і символ підкреслення. Так що якщо у вас в імені плейсхолдера є російська буква, то це послужить причиною все тієї ж помилки.

5. Якщо рядок запиту формується динамічно, то при появі таких помилок необхідно застосувати навички налагодження - а саме, вивести сформований програмою SQL і подивитися, чи відповідає він очікуваному. До речі, при динамічному формуванні запиту слід звернути увагу на захист від ін'єкції імен полів. Імена обов'язково повинні бути прописані в скрипті, і потрапляти в запит тільки в з цього заздалегідь підготовленого списку!