我试图使我的数据库的搜索功能,细化搜索与每个额外的关键字。
我不想将其限制为固定数量的关键字,所以我使用foreach()
循环为每个关键字扩展另一个AND column LIKE ?
。
然而,数组绑定器循环产生的结果与使用其他方法产生的结果不同,这些方法应该做同样的事情。
我的表包含1列3行:"a b c", "b c", "1 2 3".
$Keywords = array("a","b","c"); //those search keywords should only apply to the first row
$sql = "SELECT * FROM table WHERE column LIKE ?";
foreach ($Keywords as $Keyword) {
if ($count > 0) {
$sql = $sql . "AND column LIKE ?";
}
$count = $count + 1;
}
$query = $con->prepare($sql);
//loop to bind parameters
foreach ($Keywords as $n=>$Keyword) {
$Keyword = "%".$Keyword."%";
$query->bindParam($n+1,$Keyword,PDO::PARAM_STR);
}
$query->execute;
这将返回a b c
和b c
行,尽管它应该只返回包含所有3个字符串的行:a, b和c。
如果我不使用循环来绑定参数(这限制了关键字的数量),它会做它应该做的,只显示"a b c"。
$a = "%a%";
$b = "%b%";
$c = "%c%";
$query->bindParam(1,$a,PDO::PARAM_STR);
$query->bindParam(2,$b,PDO::PARAM_STR);
$query->bindParam(3,$c,PDO::PARAM_STR);
也可以如果我只执行这个:
$sql = "SELECT * FROM table WHERE column LIKE '%a%' AND column LIKE '%b%' AND column LIKE '%c%'";
工作示例使用%
通配符,但您的循环值不使用。
$Keywords = array("a","b","c");
$Keywords = array("%a%","%b%","%c%");
或另一种解决方案是在bindParam
调用
foreach ($Keywords as $n=>$Keyword) {
$query->bindParam($n+1,"%$Keyword%",PDO::PARAM_STR);
}
另一个潜在的问题是,您构建的查询在?
和AND
之间没有空格,即
SELECT * FROM table WHERE column LIKE ?AND column LIKE ?AND column LIKE ?
虽然我不确定?
后面的空格是否非法,但我建议用空格
AND
条件$sql = $sql . " AND column LIKE ? ";
^ ^