Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Mysql 带通配符的类Codeigniter(%)_Mysql_Sql_Codeigniter_Activerecord - Fatal编程技术网

Mysql 带通配符的类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

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

$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')
,如答案中链接中所述。请不要这样做,你会敞开心扉,你可以试试,但要确保安全。