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

时间:2012-11-03 23:57:38

标签: php pdo sql-like

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

    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 =' apple ipod&#39 ;; $ search ='%apple%AND itemTitle LIKE%ipod%';

所以准备好的陈述应该是这样的:

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

当两个产品同时返回时,没有结果返回" apple"和" ipod"他们的头衔。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

Prepared语句保护您免受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->bindParam($key+1, '%'.$keyword.'%');
  }
  $sql->execute ();