Помилка PDO: SQLSTATE [HY000]: загальна помилка: 2031

Я отримую цю дратую помилку, і хоча я маю уявлення про те, чому я її отримую, я не можу знайти для мене рішення для вирішення цього питання.

if ($limit) {
   $sth->bindValue(':page', $page - 1, PDO::PARAM_INT);
   $sth->bindValue(':entries_per_page', $page * $entries_per_page, PDO::PARAM_INT);
}

$sth->execute($criteria);

Запит містить заповнювачі (: placeholder ). Але для того, щоб додати ці мінус-заповнювачі LIMIT, мені потрібно скористатись ручним методом ( bindValue ), тому що в іншому випадку двигун перетворить їх у рядки.

Я не отримую помилкове число помилок параметрів, тому всі заповнювачі були пов'язані правильно (я припускаю).

Запит:

SELECT `articles`.*, `regional_municipalities`.`name` AS `regional_municipality_name`, 
       `_atc_codes`.`code` AS `atc_code`, `_atc_codes`.`name` AS `substance`
FROM `articles`
LEFT JOIN `_atc_codes`
ON (`_atc_codes`.`id` = `articles`.`atc_code`)
JOIN `regional_municipalities`
ON (`regional_municipalities`.`id` = `articles`.`regional_municipality`)
WHERE TRUE AND `articles`.`strength` = :strength
GROUP BY `articles`.`id`
ORDER BY `articles`.`id`
LIMIT :page, :entries_per_page

Всі значення заповнювача містяться в критеріях $, за винятком останніх двох LIMIT, які я вручну зв'яжу з bindValue() .

17
1) Було б приємно включити прочитане повідомлення про помилку, а не лише загадковий код, 2) Покажіть ваш фактичний запит, щоб ми бачили, звідки виникає помилка.
додано Автор deceze, джерело
Ви впевнені, що ви також зобов'язуєтесь : strength ? Звичайно, $ limit є правдою?
додано Автор deceze, джерело
@deceze Якщо в ньому було щось зрозуміле для читання, я б: а), можливо, вирішив його зараз, б) якщо ні, то включив його тут. Це було повне повідомлення про помилку, довіряйте мені.
додано Автор silkfire, джерело
@davidstrachan Чи знаєте ви, чому моя версія PHP не повертає це "повідомлення про помилку"?
додано Автор silkfire, джерело
@deceze Так, $ criteria містить лише одне значення: 'strength' => рядок '1g' (довжина = 2)
додано Автор silkfire, джерело
Спробуйте виконати пошук в Google "Параметри, пов'язані з PDO LIMIT"
додано Автор Royal Bg, джерело
Помилка: 2031 (CR_PARAMS_NOT_BOUND) Повідомлення: Немає даних для параметрів у підготовленому звіті з документації dev.mysql.com/doc/refman/5.0/en/error-messages-client.html
додано Автор david strachan, джерело

7 Відповіді

You cannot use ->bind* and ->execute($params). Use either or; if you pass parameters to execute(), those will make PDO forget the parameters already bound via ->bind*.

18
додано

Ця сама помилка 2031 може бути випущена, коли одна зв'язує два значення з тим самим ім'ям параметра, як у:

  • $sth->bindValue(':colour', 'blue');
  • $sth->bindValue(':colour', 'red');

..так, будьте обережні.

18
додано
Цей відповідь врятував мій день!
додано Автор JWizard, джерело

Це виключення також з'являється, якщо ви намагаєтеся запустити запит з заповнювачами, а не створити такий документ, як

$stmt = $db->query('SELECT * FROM tbl WHERE ID > ?');

замість

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?');
4
додано

З посібника :

public bool PDOStatement :: execute ([array $ input_parameters])

     

Виконайте підготовлену заяву. Якщо підготовлена ​​заява включена   маркери параметрів, ви повинні або :

     
      
  • виклик PDOStatement :: bindParam() для прив'язки змінних PHP до маркерів параметрів: пов'язані змінні передають їх значення як вхідні дані;   отримати вихідне значення, якщо такі є, їх відповідного параметра   маркери

  •   
  • або передайте масив лише значення параметрів для введення

  •   

Вам потрібно вибрати метод. Ви не можете змішувати обидва.

3
додано
Я не можу використовувати bindParam / bindValue для інших значень ... зітхання.
додано Автор silkfire, джерело
PDO :: ATTR_EMULATE_PREPARES, true) - не слід, щоб дозволити емулювати готується? Я думаю, це навпаки, навпаки, дуже вводить в оману.
додано Автор silkfire, джерело
@silkfire Див. MySQL з підготовленим твердженням може бути ще помилкою "> stackoverflow.com/questions/10014147/… для інших ідей.
додано Автор Álvaro González, джерело
@silkfire - Це для виявлення помилки, я просто його виправив.
додано Автор Álvaro González, джерело
Дякую, що ви цитуєте посібник!
додано Автор Mel_T, джерело

Це не точно відповідь, але ця помилка також трапляється, якщо ви намагаєтеся використовувати слово з дефісом як заповнювач, наприклад:

$sth->bindValue(':page-1', $page1);

Тож краще використовувати

$sth->bindValue(':page_1', $page1);

2
додано

Виняток також трапляється (принаймні в MySQL/PDO), коли ваш SQL намагається оновити поле AUTO_INCREMENT.

1
додано

Це трапляється, якщо у вас є невідповідні параметри. Наприклад:

$q = $db->prepare("select :a, :b");
$q->execute([":a"=>"a"]);
0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php