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 更改占位符名称以反映您正在搜索的字段。然后不要调用绑定参数 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 回答