CodeIgniter "like()" 函数在搜索词中带有 % 通配符
CodeIgniter "like()" function with % wildcard inside search terms
假设我有这样的功能:
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%'
如您所见,%
通配符可以在两边添加,before
和 after
。
如果我想制作这样的东西怎么办:
... WHERE foo_column LIKE '%match%something%'?
仅供参考,我使用 str_replace()
函数到 change space
到 %
但是 codeigniter 总是 escape
它与 slash
.
它产生如下查询:
... WHERE foo_column LIKE '%match\%something%'
这在搜索 匹配另一个东西 时很有用 匹配一些东西 ,并且 wildcard
在第一个 [=42] =] 之后似乎不起作用。
$this->db->like()
函数转义它包含的特殊字符 - 当然包括 %.
我想,绕过这个问题并使用包含 LIKE
子句的 where 函数:
$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();
为了实现这种功能,我已经用一些不同的条件更新了您的代码。
Note: Here I've manually placed values of categories and search
public function get_list($category = '', $limit = 10, $offset = 0) {
$category = 'electronics';
if (!empty($category)) {
$this->db->where('category', $category);
}
$search = 'match something';
if (preg_match('/\s/', $search) > 0) {
$search = array_map('trim', array_filter(explode(' ', $search)));
foreach ($search as $key => $value) {
$this->db->or_like('foo_column', $value);
}
} else if ($search != ''){
$this->db->like('foo_column', $search);
}
$query = $this->db->get('table_name', $limit, $offset);
return $query->result();
}
这里 $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 another'
那么它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
如果 $search = 'match'
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
如果 $search = ''
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
从 3.0.0 开始使用 "Query Builder"(相对于以前的版本 "Active Record")like()
有一个额外的参数可以防止转义匹配字符串:
$this->db->like('foo_column', '%match%something%', 'none', false)
- 第三个参数 =
'none'
防止 prefix/postfix 额外的通配符
- 第 4 个参数 =
false
防止转义嵌入的通配符
请注意,如果您为匹配字符串使用变量而不是文字,则当第 4 个参数为 false
时,您应该使用 $this->db->escape_like_str($match)
假设我有这样的功能:
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%'
如您所见,%
通配符可以在两边添加,before
和 after
。
如果我想制作这样的东西怎么办:
... WHERE foo_column LIKE '%match%something%'?
仅供参考,我使用 str_replace()
函数到 change space
到 %
但是 codeigniter 总是 escape
它与 slash
.
它产生如下查询:
... WHERE foo_column LIKE '%match\%something%'
这在搜索 匹配另一个东西 时很有用 匹配一些东西 ,并且 wildcard
在第一个 [=42] =] 之后似乎不起作用。
$this->db->like()
函数转义它包含的特殊字符 - 当然包括 %.
我想,绕过这个问题并使用包含 LIKE
子句的 where 函数:
$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();
为了实现这种功能,我已经用一些不同的条件更新了您的代码。
Note: Here I've manually placed values of categories and search
public function get_list($category = '', $limit = 10, $offset = 0) {
$category = 'electronics';
if (!empty($category)) {
$this->db->where('category', $category);
}
$search = 'match something';
if (preg_match('/\s/', $search) > 0) {
$search = array_map('trim', array_filter(explode(' ', $search)));
foreach ($search as $key => $value) {
$this->db->or_like('foo_column', $value);
}
} else if ($search != ''){
$this->db->like('foo_column', $search);
}
$query = $this->db->get('table_name', $limit, $offset);
return $query->result();
}
这里 $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 another'
那么它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
如果 $search = 'match'
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
如果 $search = ''
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
从 3.0.0 开始使用 "Query Builder"(相对于以前的版本 "Active Record")like()
有一个额外的参数可以防止转义匹配字符串:
$this->db->like('foo_column', '%match%something%', 'none', false)
- 第三个参数 =
'none'
防止 prefix/postfix 额外的通配符 - 第 4 个参数 =
false
防止转义嵌入的通配符
请注意,如果您为匹配字符串使用变量而不是文字,则当第 4 个参数为 false
$this->db->escape_like_str($match)