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

标签 php mysql arrays pdo

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

我不想将它限制为固定数量的关键字,所以我使用 foreach() 循环通过另一个 AND column LIKE ? 来扩展 sql for每个关键字。

然而,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。

如果我不使用循环来绑定(bind)参数(这限制了关键字的数量),它会执行预期的操作并且只显示“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 ? ";
               ^                 ^

关于php - 如何使用数组中的多个关键字搜索 mysql 表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835368/

相关文章:

php - 我似乎找不到将 CSS 添加到 Drupal 模块的方法

EBS AMI 和持久性上的 MySQL

python - 在python中生成唯一的随机二进制数组

php:检查数组中的某个项目是否为空

Php将括号后的单词大写

php - Ionic 框架 http post 请求

mysql - 根据同一表中的行更新值

mysql - 如何在多对多场景下查询没有作者的图书

javascript - 映射数组以设置空元素

PHP Laravel Gallery 将数组拆分为 3 列