2013-04-26 18 views
13

Ho una query di database semplice in codeigniter, tuttavia non riesco a trovare la ricerca per funzionare con caratteri jolly. Questo è il mio codice:Codeigniter LIKE con carattere jolly (%)

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

Se rimuovo jolly (%) e poi di ricerca funziona bene. Anche $ query è solo una stringa con l'input dell'utente. Qualsiasi aiuto è apprezzato.

+0

provare senza $ this-> db-> escape_like_str ($ query); – Spec

+0

ma non dimenticare $ this-> db-> come ('film.title', $ query, prima); è una ricerca molto costosa perché mysql non può usare un indice per questo. Meglio usare l'indice di testo completo – Michael

risposta

28

$this->db->like() aggiunge automaticamente la% s e sfugge la stringa. Quindi tutto ciò che serve è

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

Vedi Active Record Class (CI 2) o Query Builder Class (CI 3) nei documenti di CI per riferimento.

+0

Non funziona così. Se cerco diciamo Die Hard, questo lo trova perché il titolo è abbinato. Se uso solo Die o Hard, non viene trovato nulla. Se uso SQL con valore stringa, funziona bene. –

+0

Il mio male ho avuto ulteriore errore nel programma. –

+1

Per '% $ query' puoi usare' $ this-> db-> like ('title', $ query, 'before') 'e per' $ query% 'puoi usare' $ this-> db-> come ('title', $ query, 'after') 'come detto nel link nella risposta. – Mehmed

1

sto usando

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

L'ho provato ma non funziona –

+0

Per favore non farlo, ti aprirai a [SQL injection] (https://www.owasp.org/index.php/SQL_Injection) – ntzm

+1

Puoi provare questo, ma assicurati che sia sicuro. – jned29

1

Se non si desidera utilizzare il carattere jolly (%), è possibile passare al terzo argomento opzionale l'opzione 'nessuno'.

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

pelliccia completo come è possibile utente:

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

Per% $ query è possibile utilizzare

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

e per $% query è possibile utilizzare

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

La ricerca di più campi contemporaneamente può essere eseguita in questo modo ...

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%' 
Problemi correlati