使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询

Posted

技术标签:

【中文标题】使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询【英文标题】:LIKE query using multiple keywords from search field using PDO prepared statement 【发布时间】:2012-11-03 23:57:37 【问题描述】:

网站用户使用搜索表单来查询产品数据库。输入的关键字在数据库中搜索产品的标题。

    public function startSearch($keywords)
        $keywords = preg_split('/[\s]+/', $keywords);
        $totalKeywords = count($keywords);

        foreach($keywords as $key => $keyword)
            $search .= '%'.$keyword.'%';
            if($key != ($totalKeywords)-1)
                $search .= ' AND itemTitle LIKE ';
            
        
$sql=$this->db->prepare("SELECT * FROM prodsTable WHERE itemTitle LIKE ?");
$sql->bindParam(1, $search);        
$sql->execute ();
$sql->fetchALL(PDO::FETCH_ASSOC);

如果用户输入单个关键字,则搜索有效,但如果使用多个关键字,则不会执行查询。

如果: $keywords = '苹果 ipod'; $search = '%apple% AND itemTitle LIKE %ipod%';

所以准备好的语句应该是这样的:

"SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod%"

当两个产品应返回标题中同时包含“apple”和“ipod”时,不会返回任何结果。

我做错了什么?

【问题讨论】:

"SELECT * FROM prodsTable WHERE itemTitle LIKE '%apple%' AND itemTitle LIKE '%ipod%'"。你喜欢的模式被引用了吗? 在 foreach 语句中,它是 '%'.$keyword.'%',它返回以下准备好的语句: SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% 有效。但是,当添加第二个或第三个关键字时,$search 变量变为:'%'.$keyword.'%' AND itemTitle LIKE --> 给出准备好的语句:SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod% 不起作用。添加多个关键字不会提供结果。我已经尝试过: itemTitle LIKE '%aple%' 但这也不起作用。我准备的没有引号的原件有效。 bindParam 会在需要时添加引号,所以没关系 一旦关键字搜索有效。不止一个没有。这是执行的确切语句,但没有结果。 SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod% 【参考方案1】:

Prepared statements 保护您免受sql注入,因此参数中的sql代码不会被解释。在调用 prepare() 之前,您必须使用正确编号的 AND itemTitle LIKE ? 构建一个 sql 查询。

  $keywords = preg_split('/[\s]+/', $keywords);
  $totalKeywords = count($keywords);
  $query = "SELECT * FROM prodsTable WHERE itemTitle LIKE ?";

  for($i=1 ; $i < $totalKeywords; $i++)
    $query .= " AND itemTitle LIKE ? ";
  

  $sql=$this->db->prepare($query);
  foreach($keywords as $key => $keyword)
    $sql->bindValue($key+1, '%'.$keyword.'%');
  
  $sql->execute ();

【讨论】:

谢谢!我必须进行以下更改,因为它不会让我通过引用传递。 foreach($keywords as $key => $keyword) $search = '%'.$keyword.'%'; $sql->bindParam($key+1, $search);非常感谢您的帮助,我也感谢您的解释。 这个答案更值得称赞...救了我的命! :)

以上是关于使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 准备语句和 MySQL 选择字段为空的行

带有位域的 PDO 准备好的语句

在 where 子句中具有多个条件的 PDO 准备语句

PHP - 具有未知数量参数的安全 PDO 准备语句

使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]

使用 PDO 准备好的语句 MySQL 错误