Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter“;like();搜索项中包含%通配符的函数_Php_Mysql_Codeigniter_Query Builder - Fatal编程技术网

Php CodeIgniter“;like();搜索项中包含%通配符的函数

Php CodeIgniter“;like();搜索项中包含%通配符的函数,php,mysql,codeigniter,query-builder,Php,Mysql,Codeigniter,Query Builder,假设我有这样的函数: public function get_list($category = '', $limit = 10, $offset = 0) { if (!empty($category)) $this->db->where('category', $category); $search = $this->input->get('search'); if (!empty($search

假设我有这样的函数:

 public function get_list($category = '', $limit = 10, $offset = 0) {
        if (!empty($category))
            $this->db->where('category', $category);
        $search = $this->input->get('search');
        if (!empty($search))
            $this->db->or_like(array('foo_column'=>$search));
        $query = $this->db->get('table_name', $limit, $offset);
        //echo $this->db->last_query();
        return $query->result();
 }
将查询生成为:

SELECT * FROM table_name WHERE foo_column LIKE '%match something%'
正如您所看到的,
%
通配符可以添加在两侧,
前面
后面

如果我想生产这样的产品,我该怎么做:

... WHERE foo_column LIKE '%match%something%'?
仅供参考,我使用
str_replace()
函数
将空格
更改为
%
,但代码点火器始终
使用
斜杠
进行转义。 它生成如下查询:

... WHERE foo_column LIKE '%match\%something%'
当搜索用关键字匹配另一个东西时,这很有用,而且第一个和/或之后的
通配符似乎不起作用。

函数
$This->db->like()
会转义它包含的特殊字符,当然包括
%。

我想,应该绕过这个问题,使用一个where函数,其中包含
LIKE
子句:

$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();

为了实现这种功能,我用一些不同的条件更新了您的代码,如

注意:这里我手动放置了类别和搜索的值

此处
$search='match something'
将生成如下查询:

SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND  
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' LIMIT 10
如果
$search='match something other'
,它将生成如下查询:

SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR 
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
如果
$search='match'
,它将生成如下查询

SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR 
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
如果
$search=''

SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR 
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND 
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10

从3.0.0开始,使用“查询生成器”(与以前版本的“活动记录”相比),
like()
有一个额外的参数,用于防止转义匹配字符串:

$this->db->like('foo_column', '%match%something%', 'none', false)
  • 第三个参数=
    'none'
    防止附加通配符字符的前缀/后缀
  • 第四个参数=
    false
    防止嵌入式通配符的转义

注意:如果你对匹配字符串使用一个变量而不是一个文本,那么当第四个参数为
false时,你应该使用
$this->db->escape\like\u str($match)
非常感谢,这就是我要寻找的,也许从CodeIgniter 3开始添加$this->db->group\u start()和$this->db->group\u end()是一个好方法。