Php 类似于使用PDO语句从搜索字段中使用多个关键字的查询

Php 类似于使用PDO语句从搜索字段中使用多个关键字的查询,php,pdo,sql-like,Php,Pdo,Sql Like,网站用户使用搜索表单查询产品数据库。输入的关键字搜索数据库中产品的标题 public function startSearch($keywords){ $keywords = preg_split('/[\s]+/', $keywords); $totalKeywords = count($keywords); foreach($keywords as $key => $keyword){ $search .

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

    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'; $search='%apple%和类似%ipod%的itemTitle

因此,准备好的声明应如下所示:

“从prodsTable中选择*,其中itemTitle类似于%apple%,itemTitle类似于%ipod%”

当两款产品的标题中同时包含“苹果”和“ipod”时,不会返回结果


我做错了什么?

准备好的语句可以防止sql注入,因此参数中的sql代码不会被解释。在调用prepare()之前,您必须使用正确数量的
和类似于?
的itemTitle构建一个sql查询

$keywords=preg_split('/[\s]+/',$keywords);
$totalKeywords=计数($keywords);
$query=“从prodsTable中选择*,其中itemTitle类似于?”;
对于($i=1;$i<$totalKeywords;$i++){
$query.=“和itemTitle类似吗?”;
}
$sql=$this->db->prepare($query);
foreach($keywords作为$key=>$keyword){
$sql->bindValue($key+1,“%”.$keyword,“%”);
}
$sql->execute();

“从prodsTable中选择*,其中itemTitle类似于“%apple%”,itemTitle类似于“%ipod%””
。您的like模式是否被引用?在foreach语句中,它是“%$keyword”。%”,它返回准备好的语句:SELECT*FROM prodsTable WHERE itemTitle,如%apple%,该语句有效。但是,当添加第二个或第三个关键字时,$search变量变为:“'.$keyword.%”和类似itemTitle-->时,给出准备好的语句:SELECT*FROM prodsTable,其中类似于%apple%的itemTitle和类似于%ipod%的itemTitle不起作用。添加多个关键字不会提供结果。我尝试过:itemTitle,比如“%aple%”,但这也不起作用。我的原稿没有引号就可以工作。
bindParam
将在需要时添加引号,因此它的okOnce关键字搜索可以工作。不止一个没有。这是执行的确切语句,但没有结果。从prodsTable中选择*,其中itemTitle(如%apple%)和itemTitle(如%ipod%)谢谢!我不得不做以下更改,因为它不允许我通过引用。foreach($key=>$keyword){$search='%'.$keyword.'%';$sql->bindParam($key+1,$search);}非常感谢您的帮助,我也感谢您的解释。这个答案值得更多的赞扬。。。救了我的命!:)
  $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 ();