22

この迷惑なエラーが表示されます。エラーが発生する理由はわかっていますが、一生解決策を見つけることはできません。

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) を使用する必要があります。そうしないと、エンジンがプレースホルダーを文字列に変換してしまうからです。

Invalid number of parameters エラーが発生しないため、すべてのプレースホルダーが正しくバインドされています (私は推測します)。

クエリ:

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

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

4

7 に答える 7

30

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

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

…だから、気をつけて。

于 2016-03-01T18:42:20.783 に答える
27

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

于 2013-06-24T11:58:40.103 に答える
17

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

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

それ以外の

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?');
于 2016-10-10T20:03:42.487 に答える
3

マニュアルから:

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

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

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

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

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

于 2013-06-24T11:59:00.933 に答える
2

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

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

だからより良い使用

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

于 2017-01-03T18:03:36.557 に答える
0

SQL が AUTO_INCREMENT フィールドを UPDATE しようとすると、(少なくとも MySQL/PDO では) 例外も発生します。

于 2017-01-02T02:09:30.820 に答える