私はこの厄介なエラーを受け取っています。なぜそれを受け取っているのかはわかりますが、私の人生では解決策を見つけることはできません。
_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にあります。
_->bind*
_ and->execute($params)
は使用できません。またはのいずれかを使用します。パラメーターをexecute()
に渡すと、_->bind*
_を介して既にバインドされているパラメーターをPDOが忘れます。
次のように、同じパラメーター名を持つ2つの値をバインドすると、この同じエラー2031が発行される可能性があります。
$sth->bindValue(':colour', 'blue');
$sth->bindValue(':colour', 'red');
..so、注意してください。
この例外は、次のようなステートメントを準備する代わりに、プレースホルダーでクエリを実行しようとした場合にも表示されます
$stmt = $db->query('SELECT * FROM tbl WHERE ID > ?');
の代わりに
$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?');
マニュアル から:
public bool PDOStatement::execute ([ array $input_parameters ] )
準備されたステートメントを実行します。準備されたステートメントにパラメーターマーカーが含まれている場合は、eitherを行う必要があります。
pDOStatement :: bindParam()を呼び出して、PHP変数をパラメーターマーカーにバインドします。バインドされた変数は、入力として値を渡し、関連するパラメーターマーカーの出力値を受け取ります。
または、入力専用のパラメーター値の配列を渡す
メソッドを選択する必要があります。両方を混在させることはできません。
正確な答えではありませんが、プレースホルダーとしてハイフンを含むWordを使用しようとすると、このエラーも発生します。たとえば、
$sth->bindValue(':page-1', $page1);
使いやすさ
$sth->bindValue(':page_1', $page1);
これは、パラメータが一致しない場合に発生します。例えば:
$q = $db->prepare("select :a, :b");
$q->execute([":a"=>"a"]);