2013-04-26 11 views
13

私はcodeigniterで簡単なデータベースクエリを持っていますが、ワイルドカードで検索することはできません。これは私のコードです:ワイルドカード(%)を使用したCodeigniter LIKE

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

ワイルドカード(%)を削除すると、正常に動作します。また、$ queryはユーザー入力を伴う文字列です。どんな助けもありがとうございます。

+0

ます$ this-> DB-> escape_like_str($クエリ)なしでみてください。 – Spec

+0

しかし、$ this-> db-> like( 'film.title'、$ query、before)は忘れてはいけません。 mysqlはインデックスを使用できないため、非常に高価な検索です。もっとよく使う全文索引 – Michael

答えて

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を検索しようとすると、タイトルが一致しているため、これが検索されます。 DieまたはHardだけを使用しても、何も見つかりません。私は文字列の値でSQLを使用する場合、それは正常に動作します。 –

+0

私は悪い私はさらにプログラムでエラーがあった。 –

+1

'%$ query'では' $ this-> db-> like( 'title'、$ query、 'before') 'を使用できます。' $ query% 'には' $ this-> db->その答えのリンクに書かれているように( 'title'、$ query、 'after') ' – Mehmed

1

私は自動的に

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

私は試しましたが、うまくいきません –

+0

しないでください。あなたは[SQLインジェクション](https://www.owasp.org/index.php/SQL_Injection)まで開きます – ntzm

+1

これを試すことはできますが、安全であることを確認してください。 – jned29

1

ワイルドカード(%)を使用しない場合は、オプションの第3引数にオプション '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%' 
関連する問題