2012-04-23 162 views
1

我使用单个搜索字段创建表单,并且希望该字段可以针对3个不同的sql列进行查询(请考虑专辑标题,曲目名称和艺术家)。SQL PHP占位符多次使用

这是我想要做的工作代码...

$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]:[微软] [SQL Server本机客户端10.0] COUNT字段不正确或语法错误

从我所看到的所有教程,这并不意味着占位符被使用超过一次(每个字段应该有自己的)。有没有办法让这个工作?

JJ

回答

4

标识仅仅指刚改变占位符名称,以反映该领域的youre搜索。然后,而不是调用绑定参数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

这很好。我曾尝试过类似的过程?其中'$ search = array(“%”。$ _ POST [“sermon”]。“%”,“%”。$ _ POST [“sermon”]。“%”,“%”。$ _ POST [“sermon”] 。“%”);'但它不起作用。 – doubleJ 2012-04-23 21:14:01

0

我会用问号(?),并呼吁bindParam()每个问号建议。

+2

根据我的经验,'?'占位符在几个之后变得笨重,作者通过使用命名参数来做正确的事情,因为它使事情变得更容易阅读。 – 2012-04-23 20:45:42

-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 2012-04-23 20:50:43

+1

是的,它会工作,但它确实打开一个相当大的安全漏洞! – halfer 2012-04-23 20:53:47