2013-04-26 83 views
13

我在codeigniter中有簡單的數據庫查詢,但是我無法讓搜索與通配符一起工作。這是我的代碼:Codeigniter喜歡與通配符(%)

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

如果我刪除通配符(%),然後搜索工作正常。另外$查詢只是用戶輸入的字符串。任何幫助表示讚賞。

+0

嘗試沒有$這個 - > DB-> escape_like_str($查詢); – Spec 2013-04-26 00:42:50

+0

但不要忘記$ this-> db-> like('film.title',$ query,before);是一個非常昂貴的搜索,因爲mysql不能爲此使用索引。更好地使用全文索引 – Michael 2016-07-05 21:39:41

回答

28

$this->db->like()自動添加%s和逃逸的字符串。因此,所有你需要的是

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

參考見CI的文檔Active Record Class (CI 2)Query Builder Class (CI 3)

+0

它不這樣工作。如果我搜索讓我們說死硬,這發現它,因爲標題匹配。如果我只是使用Die或Hard,沒有發現任何東西。如果我使用帶有字符串值的SQL,它可以正常工作。 – 2013-04-26 00:54:42

+0

我的不好我在程序中有進一步的錯誤。 – 2013-04-26 01:03:11

+1

對於'%$ query',你可以使用'$ this-> db-> like('title',$ query,'before')'和'$ query%',你可以使用'$ this-> db->就像在答案中的鏈接所說的那樣('標題',$查詢,'之後')'。 – Mehmed 2013-10-24 07:53:24

1

我使用

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

我試過了,但它不起作用 – 2013-04-26 00:36:41

+0

請不要這樣做,你會打開自己的[SQL注入](https://www.owasp.org/index.php/SQL_Injection) – ntzm 2016-09-28 13:23:05

+1

你可以試試這個,但要確保它是安全的。 – jned29 2016-10-21 06:09:33

1

如果你不想使用通配符(%),你可以傳遞給可選的第三個參數'none'。

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

皮草全部喜歡,你可以用戶:

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

對於%$查詢,你可以使用

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

和$查詢%可以使用

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

一次搜索多個字段可以像這樣完成...

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%"); 
} 
0
$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%'