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