【问题标题】:Codeigniter LIKE with wildcard(%)带通配符的 Codeigniter LIKE (%)
【发布时间】:2013-04-20 01:33:48
【问题描述】:

我在 codeigniter 中有简单的数据库查询,但是我无法使用通配符进行搜索。这是我的代码:

$this->db->like('film.title',"%$query%");
$this->db->escape_like_str($query);
$res = $this->db->get('film');

如果我删除通配符(%),那么搜索工作正常。 $query 也只是带有用户输入的字符串。任何帮助表示赞赏。

【问题讨论】:

  • 尝试不使用 $this->db->e​​scape_like_str($query);
  • 但不要忘记 $this->db->like('film.title',$query,before);是一个非常昂贵的搜索,因为 mysql 不能为此使用索引。更好地使用全文索引

标签: mysql sql codeigniter activerecord


【解决方案1】:

$this->db->like() 自动添加 %s 并转义字符串。所以你只需要

$this->db->like('title', $query);
$res = $this->db->get('film');

请参阅 CI 文档以供参考:CI 2CI 3CI 4

【讨论】:

  • 这样不行。如果我搜索让我们说死硬,这会找到它,因为标题匹配。如果我只使用 Die 或 Hard,则什么也找不到。如果我使用带有字符串值的 SQL,它可以正常工作。
  • 对于%$query,您可以使用$this->db->like('title', $query, 'before'),对于$query%,您可以使用$this->db->like('title', $query, 'after'),如答案中的链接所述。
【解决方案2】:
  $this->db->like('title', 'match', 'before'); 
 // Produces: WHERE title LIKE '%match' 

 $this->db->like('title', 'match', 'after'); 
// Produces: WHERE title LIKE 'match%' 

$this->db->like('title', 'match', 'both'); 
// Produces: WHERE title LIKE '%match%'

【讨论】:

    【解决方案3】:

    对于像你一样的完整用户:

    $this->db->like('title',$query);
    

    对于 %$query,您可以使用

    $this->db->like('title', $query, 'before');
    

    对于 $query%,您可以使用

    $this->db->like('title', $query, 'after');
    

    【讨论】:

      【解决方案4】:

      $this->db->like()

      此方法使您能够生成 LIKE 子句,对进行搜索很有用。

      $this->db->like('title', 'match');

      产生:WHERE title LIKE '%match%'

      如果要控制通配符 (%) 的放置位置,可以使用可选的第三个参数。您的选项是“之前”、“之后”、“无”和“两者”(这是默认设置)。

      $this->db->like('title', 'match', 'before');

      产生:WHERE title LIKE '%match'

      $this->db->like('title', 'match', 'after');

      产生:WHERE title LIKE 'match%'

      $this->db->like('title', 'match', 'none');

      产生:WHERE title LIKE 'match'

      $this->db->like('title', 'match', 'both');

      产生:WHERE title LIKE '%match%'

      【讨论】:

        【解决方案5】:

        如果您不想使用通配符 (%),您可以将选项“none”传递给可选的第三个参数。

        $this->db->like('title', 'match', 'none'); 
        // Produces: WHERE title LIKE 'match'
        

        【讨论】:

          【解决方案6】:

          我正在使用

          $this->db->query("SELECT * FROM film WHERE film.title LIKE '%$query%'"); for such purposes
          

          【讨论】:

          • 请不要这样做,你会打开自己的SQL injection
          • 你可以试试这个,但要确保它安全。
          【解决方案7】:

          可以像这样一次搜索多个字段...

          function search($search)
          {
              $sql = "SELECT * FROM some_table
              WHERE UPPER(a_name) LIKE ?
              OR
              UPPER(a_full_name) LIKE ?
              OR
              UPPER(a_city) LIKE ?
              OR
              UPPER(a_code) LIKE ?
              ";
              $arr = array_map(array($this,"wrapLIKE"),array($search, $search, $search, $search));
              $r = $this->db->query($sql, $arr);
              return $r;
          }
          
          function wrapLIKE($string)
          {
              return strtoupper("%$string%");
          }
          

          【讨论】:

            猜你喜欢
            • 2015-07-25
            • 2021-06-23
            • 1970-01-01
            • 1970-01-01
            • 2012-12-15
            • 1970-01-01
            • 2013-02-16
            • 1970-01-01
            相关资源
            最近更新 更多