2013-06-24 21 views
15

私はこの厄介なエラーを受けていますが、なぜ私はそれを取得しているのアイデアはありますが、私の人生のための解決策を見つけることはできません。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を除き、$基準に常駐します。

+1

は、そうではなく、単に不可解なコードの人間が読めるエラーメッセージを含めることが良かった2)あなたの実際のクエリを表示しただろう)Googleの「PDO結合LIMITパラメータ」 –

+0

1で検索してみてくださいエラーの原因がどこにあるかを見ることができます。 – deceze

+0

@deceze人間が読めるメッセージがあれば、私は:a)おそらく今までに解決していた、b)そうでなければ、ここに含めたと思うだろう。これは完全なエラーメッセージで、私を信頼してください。 – silkfire

答えて

17

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

3

:あなたが方法を選択する必要が

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

Execute the prepared statement. If the prepared statement included parameter markers, you must either:

  • call PDOStatement::bindParam() to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers

  • or pass an array of input-only parameter values

。両方を混在させることはできません。 ..so $sth->bindValue(':colour', 'red');

  • $sth->bindValue(':colour', 'blue');
  • 、用心:

+0

他の値に' bindParam'/'bindValue'を使うことはできません...一息。 – silkfire

+0

@silkfire他のアイデアについては、http://stackoverflow.com/questions/10014147/limit-keyword-on-mysql-with-prepared-statement-maybe-still-a-bug/10014200#10014200を参照してください。 –

+0

'PDO :: ATTR_EMULATE_PREPARES、true)' - エミュレートされた**を有効にするべきではありませんか?私はそれが非常に誤解を招くような、別の方法だと思います。 – silkfire

13

これと同じエラー2031は、一つのバインドのように同じパラメータ名を持つ2つの値が、ときに発行することができます。

+0

この回答は私の一日を救った! – JWizard

2

プレースホルダでクエリを実行しようとする代わりに、このような

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

代わりの

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

ようなステートメントを準備する場合は、この例外も表示されます例外は、少なくともMySQLの中で(たまたま/ PDO)がSQLのAUTO_INCREMENTフィールドを更新しようとしたときに発生します。

2

それは正確な答えではないのですが、あなたは、例えば、プレースホルダとしてハイフンで単語を使用しようとすると、このエラーがまた起こる:

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

だから、より良い

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

を使用
0

これは、不一致のパラメータがある場合に発生します。たとえば:

$q = $db->prepare("select :a, :b"); 
$q->execute([":a"=>"a"]); 
関連する問題