2015-05-20 19 views
6

Il problema è che visualizza tutte le righe da db invece di visualizzare solo quelle righe che contengono parole chiave di ricerca: per favore aiutatemi.Come scrivere codice come query

public function search($data) 
{ 

    $name = $data["name"]; 
    $surname = $data["surname"]; 

    $this->db->select('*'); 
    $this->db->from('workers'); 
    $this->db->like('name', '%' . $name . '%'); 
    $this->db->or_like('surname', '%' . $surname . '%'); 

    $query = $this->db->get();  

risposta

3

hai scritto CI come interrogazione sbagliato way.Look il documentation come scrivere correttamente

Vostri criteri dovrebbe essere come this.No necessità di aggiungere %. CI aggiungili se non passi il terzo parametro della funzione simile.

$this->db->select('*'); 
$this->db->from('workers'); 
$this->db->like('name', $name); 
$this->db->or_like('surname', $surname); 

$query = $this->db->get(); 

Meglio fare con alcuni dati validi come questo.

$this->db->select('*'); 
$this->db->from('workers'); 
if($name) 
{ 
    $this->db->or_like('name', $name); 
} 
if($surname) 
{ 
    $this->db->or_like('surname', $surname); 
} 
$query = $this->db->get(); 
0

Shaiful è corretto, le sue dichiarazioni come sono scritte in modo non corretto, ma vorrei solo per estendere su questo che bisogna stare attenti con or_ clausole in Active Record. In Codeigniter questi non utilizzare le parentesi, quindi il seguente va bene:

$this->db->select('*'); 
$this->db->like('name', $name); 
$this->db->or_like('surname', $surname); 
$query = $this->db->get('workers'); 

Produce:

SELECT * FROM `workers` WHERE `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`; 

Ma se si estende la query in un secondo momento, il seguente non funziona correttamente:

$this->db->select('*'); 
$this->db->where('id', $id); 
$this->db->like('name', $name); 
$this->db->or_like('surname', $surname); 
$query = $this->db->get('workers'); 

Questo produce:

SELECT * FROM `workers` WHERE `id`=`$id` AND `name` LIKE `%$name%` OR `surname` LIKE `%$surname%`; 

Il problema con il secondo esempio è che la clausola WHERE diventa facoltativa a causa dello OR successivo in SQL.

Codeigniter 3 ha introdotto la possibilità di utilizzare parentesi e suggerirei il seguente approccio se esiste la possibilità che la query diventi più complicata in seguito.

Quindi un approccio più sicuro a mio parere quando si utilizza or_ clausole sarebbe:

$query = $this->db->select('*')->from('workers') 
     ->group_start() 
       ->like('name', $name) 
       ->or_like('surname', $surname) 
     ->group_end() 
->get(); 

Nel tuo esempio attuale, però, non v'è alcun problema con quello che Shaiful ha dato ed è completamente compatibile con Codeigniter 2.

Problemi correlati