1

検索フィールドが 1 つのフォームを作成していますが、そのフィールドで 3 つの異なる SQL 列 (アルバムのタイトル、トラック名、アーティストなど) に対してクエリを実行したいと考えています。

これは私が機能させようとしているコードです...

$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();

これは私が得るエラーです...

SQLSTATE[07002]: [Microsoft][SQL Server Native Client 10.0]COUNT フィールドが正しくないか、構文エラーです

私が見たすべてのチュートリアルから、プレースホルダーは複数回使用することを意図していません (各フィールドには独自のものがあるはずです)。これを機能させる方法はありますか?

JJ

4

3 に答える 3

4

ID 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、同じ値の引数で呼び出すことができます...どちらの方法でも。

于 2012-04-23T20:57:18.953 に答える
0

疑問符 ( ) を使用し、疑問符ごと?に電話をかけることをお勧めします。bindParam()

于 2012-04-23T20:34:54.363 に答える
-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();
于 2012-04-23T20:37:46.847 に答える