web-dev-qa-db-ja.com

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
_

bindValue()で手動でバインドする最後の2つのLIMITを除き、すべてのプレースホルダー値は$ criteriaにあります。

19
silkfire

_->bind*_ and->execute($params)は使用できません。またはのいずれかを使用します。パラメーターをexecute()に渡すと、_->bind*_を介して既にバインドされているパラメーターをPDOが忘れます。

22
deceze

次のように、同じパラメーター名を持つ2つの値をバインドすると、この同じエラー2031が発行される可能性があります。

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

..so、注意してください。

23
Nowdeen

この例外は、次のようなステートメントを準備する代わりに、プレースホルダーでクエリを実行しようとした場合にも表示されます

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

の代わりに

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

マニュアル から:

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

準備されたステートメントを実行します。準備されたステートメントにパラメーターマーカーが含まれている場合は、eitherを行う必要があります。

  • pDOStatement :: bindParam()を呼び出して、PHP変数をパラメーターマーカーにバインドします。バインドされた変数は、入力として値を渡し、関連するパラメーターマーカーの出力値を受け取ります。

  • または、入力専用のパラメーター値の配列を渡す

メソッドを選択する必要があります。両方を混在させることはできません。

3

正確な答えではありませんが、プレースホルダーとしてハイフンを含むWordを使用しようとすると、このエラーも発生します。たとえば、

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

使いやすさ

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

2

これは、パラメータが一致しない場合に発生します。例えば:

$q = $db->prepare("select :a, :b");
$q->execute([":a"=>"a"]);
0
Charlie