SQL PHP占位符不止一次使用

时间:2012-04-23 20:32:46

标签: php sql

我正在创建一个包含单个搜索字段的表单,我希望该字段可以查询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

3 个答案:

答案 0 :(得分: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 ...无论哪种方式。

答案 1 :(得分:0)

我建议使用问号(?)并为每个问号调用bindParam()

答案 2 :(得分:-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();