2012-04-23 4 views
1

私は単一の検索フィールドでフォームを作成していますが、そのフィールドを3つの異なるSQLカラム(アルバム名、トラック名、アーティストを考える)に照会する必要があります。SQL PHPのプレースホルダが一度に使用

これは

SQLSTATE [07002] ...これは私が取得エラーです...

$search = "%".$_POST["sermon"]."%"; 
$stmt = $dbh->prepare("SELECT * FROM dbo.TblSermon WHERE (Series LIKE :search) OR (Sermon LIKE :search) OR (Speaker LIKE :search) ORDER BY Sermon ASC, Date ASC"); 
$stmt->bindParam(':search', $search); 
$stmt->execute(); 

私は仕事をするためにしようとしているコードです:[マイクロソフト] [SQL Serverネイティブクライアント10.0] COUNTフィールドが正しくないか構文エラー

私が見たすべてのチュートリアルから、プレースホルダは2回以上使用されることはありません(各フィールドにはそれぞれ独自のフィールドが必要です)。これを動作させる方法はありますか?

JJ

答えて

4

Idはyoureの検索フィールドを反映するために、プレースホルダ名を変更jsut。次に、bind params idを呼び出すのではなく、実行時にバインドするだけです。

$search = "%".$_POST["sermon"]."%"; 

$stmt = $dbh->prepare("SELECT * FROM dbo.TblSermon WHERE (Series LIKE :series) OR (Sermon LIKE :sermon) OR (Speaker LIKE :speaker) ORDER BY Sermon ASC, Date ASC"); 

$stmt->execute(array(
    ":series" => $search, 
    ":sermon" => $search, 
    ":speaker" => $search 
)); 

フィールドのトンがある場合、ただのプレースホルダの配列を定義して、あなたは配列に割り当てのために何度も何度も同じ変数名を入力して保つために持っていけないので、array_fill_keysを使用する方がよいかもしれません...もちろん、その時点でプレースホルダの配列をループして、同じ値の引数を持つbindParamを呼び出すこともできます。

+0

それはうまくいきました。私は同様のプロセスを試しましたか? $ _ POST ["sermon"]。 "%"、 "%"。$ _ POST ["sermon"] 。 "%"); 'しかし、動作しませんでした。 – doubleJ

0

私は疑問符(?)を使用し、各疑問符ためbindParam()を呼び出すことをお勧めしたいです。

+2

私の経験では、 '?'プレースホルダーはほんの少ししか扱いにくくなってしまいました。作者は物事を読みやすくするために名前付きparamsを使って正しいことをしています。 –

-1

利用のsprintf

$search = "%".$_POST["sermon"]."%"; 
$query = sprintf("SELECT * FROM dbo.TblSermon WHERE (Series LIKE '%s') OR (Sermon LIKE '%s') OR (Speaker LIKE '%s') ORDER BY Sermon ASC, Date ASC",search,search,search); 
$stmt = $dbh->prepare($query); 
$stmt->execute(); 
+0

それはそれが適切なエスケープを保証しないという事実を除いて... – prodigitalson

+1

うん、それは動作しますが、かなりのセキュリティホールではありません! – halfer

関連する問題