2011-08-31 10 views
15

LIKEを使用してデータベースのnameフィールドを検索しようとしています。名前付きパラメータをLIKE用PDOで使用する

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%how%'\n" 
     . ""; 
$sql = $db->prepare($query); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

次に、 'how'の関連する結果を返します。
しかし、私はプリペアドステートメントにそれを回すとき:私は常にゼロ結果を取得しています

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%:term%'\n" 
     . ""; 
$sql->execute(array(":term" => $_GET["search"])); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

私は間違っていますか?私はコードの他の場所で準備されたステートメントを使用しており、正常に動作します。

+0

[PDO Prepare文が処理パラメータを持たない]重複している可能性があります(http://stackoverflow.com/questions/2434560/pdo-prepare-statement-not-processing-parameters) – outis

答えて

27

バインドされた:placeholdersは、一重引用符で囲むことはできません。そうすれば、彼らは解釈されることなく、生の弦として扱われます。

あなたは、LIKEパターンとして1を使用し、その値と一緒に%を渡したい:

$query = "SELECT * 
      FROM `help_article` 
      WHERE `name` LIKE :term "; 

$sql->execute(array(":term" => "%" . $_GET["search"] . "%")); 

ああ、実際にあなたが最初にここに入力文字列(addcslashes)をきれいにする必要があります。ユーザーがパラメータ内に無関係な%文字を指定した場合、それらはLIKE一致パターンの一部になります。 :termパラメータの全体が文字列値として渡され、その文字列内のすべて%がLIKE句のプレースホルダになることに注意してください。

+2

[標準SQLでエスケープする] /drupal.org/node/654662)はそれほど単純ではありません。たとえば、PL/SQLとTransact SQLでは、エスケープ文字として使用する文字を指定する必要があります。 – jswolf19

+0

@ jswolf19:MySQLでのエスケープについては確かではありませんでした。通常は、英数字以外の文字を削除します。 (OPでも十分であるかもしれません) – mario

+0

MySQLはデフォルトでは '\'ですが、OPはDBを指定せず、標準SQLはデフォルトのエスケープ文字を指定しません。あなたは 'a LIKE b ESCAPE c'の構文を与えなければなりません。 – jswolf19

関連する問題