【问题标题】:Building multi word LIKE Prepared statement for PDO query为 PDO 查询构建多词 LIKE Prepared 语句
【发布时间】:2016-05-11 05:37:36
【问题描述】:

我正在尝试构建逻辑以创建用于 PDO 的多字 LIKE 语句。

这需要搜索字符串 $str 来构建 LIKE 部分的多个部分:

$str = $_POST['str'];

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

$search = "%$str%";
$sql_str = " AND post_content LIKE :search0 ";

for($i=1 ; $i < $totalKeywords; $i++){
    $search_bit = ":search" . $i;
    $sql_str .= " AND post_content LIKE $search_bit ";
}

这是 SQL 语句 - 将 $sql_str 插入正确的位置:

$sql = "SELECT d.ID
             , d.post_date
             , d.post_content
             , d.post_cat_id
             , d.post_label
             , c.fld_cat
          FROM tbl_log_days d
             , tbl_log_cats c
         WHERE d.post_cat_id = c.fld_id " . $sql_str . "
      ORDER BY post_date";

然后为了绑定变量,我尝试了两种方法:

$stmt = $pdo->prepare($sql);

if (!empty($sql_str)) {

    foreach ($keywords as $key => &$keyword){
        $foo = '%'.$keyword.'%';
        $stmt->bindParam(':search' . $key, $foo);
    }

}

还有这个(在 foreach 行中 $keyword 之前没有和号):

$stmt = $pdo->prepare($sql);

if (!empty($sql_str)) {

    foreach ($keywords as $key => $keyword){
        $foo = '%'.$keyword.'%';
        $stmt->bindParam(':search' . $key, $foo);
    }

}

但是,当我搜索例如“过去的山”并检查实际运行的结果 SQL(我在 MySQL 中启用了查询日志记录),它只需要搜索字符串中的最后一个单词:

SELECT d.ID
     , d.post_date
     , d.post_content
     , d.post_cat_id
     , d.post_label
     , c.fld_cat
  FROM tbl_log_days d
     , tbl_log_cats c
 WHERE d.post_cat_id = c.fld_id  AND post_content LIKE '%past%'  AND post_content LIKE '%past%' 
  ORDER BY post_date

我在运行搜索时对 $keyword 变量进行了 var_dump,它返回:

string(4) "hill"
string(4) "past"

我无法解决这个问题。有可能做我想做的事吗?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    我会做这样的事情

    for($i=1 ; $i < $totalKeywords; $i++){
      $search_num = "search" . $i;
      $search_bit = ":" . $search_num;
      $sql_str .= " AND post_content LIKE $search_bit ";
        $foo = '%'.$keyword.'%';
      $V[$search_bit] = $foo;
    }
    
    $query = $pdo->prepare($sql);
    $query->execute($V);
    

    (我没有测试过这段代码,所以请原谅拼写错误。)

    【讨论】:

      【解决方案2】:

      我在 Sitepoint 上问过同样的问题: https://www.sitepoint.com/community/t/multi-word-like-prepared-statement-for-pdo-query/223738/5

      并在那里找到了解决方案:

      $stmt = $pdo->prepare($sql);
      if (!empty($sql_str)) {
          for ($x = 0; $x<$totalKeywords; $x++) {
          // add the percent signs, or make a new copy of the array first if you want to keep the parameters
          $keywords[$x] = "%" . $keywords[$x] . "%";  
          $stmt->bindParam(':search' . $x, $keywords[$x]);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 2013-03-28
        • 2021-05-28
        • 1970-01-01
        • 2012-03-27
        相关资源
        最近更新 更多