2016-05-22 10 views
1
$queryString = 'SELECT * FROM n8593370.items AND Suburb = :suburb AND Name LIKE \'%:name%\''; 

$stmt = $pdo->prepare($queryString); 
$stmt->bindValue(':suburb', $suburb); 
$stmt->bindValue(':name', $name); 

$stmt->execute(); 
$results = $stmt->fetchAll(); 

私は上記のエラーが発生している理由を理解できません。PDOオブジェクト:無効なパラメータ番号:バインドされた変数の数がトークンの数と一致しません。

私はバインドする変数が2つしかなく、実際には両方をバインドしていると確信しています。

これをそれぞれの条件付きで実行すると、WHERE 1 = 1 AND Suburb = :suburbまたはWHERE 1 = 1 AND Name LIKE \'%:name%\'となり、エラーはありません。

ALTHOUGH 2つの条件文の後ろには結果が返されませんが、MySQL Workbenchでテストすると期待通りに動作します。

誰かが問題を明らかにすることはできますか?

+0

それはトートロジーだから、それは意味がないとして '1 =その '1を削除します。 – Rahul

+0

実行前に 'echo $ queryString'を実行し、実行したものをコメントアウトして、あなたが渡しているものを見るだけです。 – Webeng

+0

1 = 1があるので、条件付きでクエリの条件を追加できます。しかし、はい、私は質問のためにそれをコメントします:) –

答えて

2

プレースホルダ値を使用する場合は、すべてのクエリをエスケープしておくことが重要です。値そのものは裸でなければなりません。プレースホルダ値の使用について訓練を受けている場合は、PDOがエスケープ処理を行います。

は、それをこのように指定します。

"...name LIKE :name..." 

次にあなたがこの方法をバインド:

$stmt->bindValue(':name', "%$name%"); 
+0

すごく助けになったヒープですが、ワークベンチ上であっても、その文はまだ結果を返さないが、少なくとも私はエラーを出さない。 –

+0

どのような種類の '$ name'を使用していますか?特殊文字はありますか? – tadman

+0

私は構文上の問題だけを整理してしまいました。 –

関連する問題