Mysql 带通配符的类Codeigniter(%)
我在codeigniter中有一个简单的数据库查询,但是我无法使用通配符进行搜索。这是我的代码:Mysql 带通配符的类Codeigniter(%),mysql,sql,codeigniter,activerecord,Mysql,Sql,Codeigniter,Activerecord,我在codeigniter中有一个简单的数据库查询,但是我无法使用通配符进行搜索。这是我的代码: $this->db->like('film.title',"%$query%"); $this->db->escape_like_str($query); $res = $this->db->get('film'); 如果我删除了通配符(%),则搜索工作正常。另外,$query只是带有用户输入的字符串。非常感谢您的帮助。我正在使用 $this->db-&g
$this->db->like('film.title',"%$query%");
$this->db->escape_like_str($query);
$res = $this->db->get('film');
如果我删除了通配符(%),则搜索工作正常。另外,$query只是带有用户输入的字符串。非常感谢您的帮助。我正在使用
$this->db->query("SELECT * FROM film WHERE film.title LIKE '%$query%'"); for such purposes
$this->db->like()
自动添加%s并转义字符串。所以你只需要
$this->db->like('title', $query);
$res = $this->db->get('film');
请参阅CI文档以获取参考:,如果不想使用通配符(%),可以将选项“无”传递给可选的第三个参数
$this->db->like('title', 'match', 'none');
// Produces: WHERE title LIKE 'match'
对于完全用户,您可以:
$this->db->like('title',$query);
对于%$查询,您可以使用
$this->db->like('title', $query, 'before');
$this->db->like('title', $query, 'after');
对于$query%,您可以使用
$this->db->like('title', $query, 'before');
$this->db->like('title', $query, 'after');
一次搜索多个字段可以这样做
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%");
}
$this->db->like()
此方法使您能够生成LIKE子句,这对执行搜索非常有用
$this->db->like('title','match')代码>
产生:其中标题
类似于“%match%”
如果要控制通配符(%)的放置位置,可以使用可选的第三个参数。您的选项有“before”、“after”、“none”和“both”(默认设置)
$this->db->like('title','match','before')代码>
产生:其中标题
类似于“%match”
$this->db->like('title','match','after')代码>
产生:其中标题
类似于“匹配%”
$this->db->like('title','match','none')代码>
产生:其中标题
类似“匹配”
$this->db->like('title','match','both')代码>
产生:其中title
类似于“%match%”不使用$this->db->escape\u LIKE\u str($query)进行尝试;但是不要忘记$this->db->like('film.title',$query,before);这是一个非常昂贵的搜索,因为mysql不能为此使用索引。更好地使用全文索引并非如此。如果我搜索,比如说死硬,这会找到它,因为标题是匹配的。如果我只是使用Die或Hard,什么也找不到。如果我将SQL与字符串值一起使用,它可以正常工作。对于%$query
您可以使用$this->db->like('title',$query,'before')
,对于$query%
您可以使用$this->db->like('title',$query after')
,如答案中链接中所述。请不要这样做,你会敞开心扉,你可以试试,但要确保安全。