如何使用数组中的多个关键字在mysql表中搜索列?

时间:2014-07-18 23:59:25

标签: php mysql arrays pdo

我正在尝试为我的数据库创建一个搜索功能,使用每个附加关键字来优化搜索。

我不想将其限制为固定数量的关键字,因此我使用foreach()循环为每个关键字扩展另一个AND column LIKE ?的SQL。

然而,array-binder循环产生的结果与使用其他方法完全相同的结果不同。

我的表包含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 cb 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%'";

1 个答案:

答案 0 :(得分:1)

工作示例使用%通配符,但您的循环值不会。

更改

$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 ? ";
               ^                 ^