2013-05-26 22 views
5

Przynajmniej tak się dzieje. Próbuję utworzyć pasek wyszukiwania dla strony internetowej i działa, z wyjątkiem tego, że nie czyta klauzuli where, która tylko wycofałaby zatwierdzoną treść. Możesz zobaczyć, dlaczego to był problem.codeigniter jak nadpisanie klauzuli gdzie klauzula

W każdym razie, to co mam w moim modelu

$match = $this->input->post('search');  
$this->db->where('approved', 'y'); 
$this->db->like('description', $match); 
$this->db->or_like('title', $match); 
$this->db->or_like('body', $match); 
$this->db->or_like('author', $match); 

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

return $query->result(); 

i kiedy wydrukować zapytanie, wydaje się, że to widząc gdzie klauzuli, ale kiedy dostać rzeczy z powrotem to ciągnięcie rzeczy, które są nie zatwierdzony lub w trakcie przeglądu.

Oto mój drukowane zapytania

SELECT * FROM (`story_tbl`) WHERE `approved` = 'y' AND `description` LIKE 
'%another%' OR `title` LIKE '%another%' OR `body` LIKE '%another%' OR 
`author` LIKE '%another%' 

Odpowiedz

2

Zapytanie powinno być

SELECT * FROM (`story_tbl`) WHERE `approved` = 'y' AND (`description` LIKE 
'%another%' OR `title` LIKE '%another%' OR `body` LIKE '%another%' OR 
`author` LIKE '%another%') 

Sprawdź te wsporniki. Najlepiej więc użyć zwykłego $this->db->query(). Jeśli upierasz się na wykorzystaniu aktywnych rekordów, co musisz zrobić, to tak dla tych nawiasach -

$match = $this->input->post('search'); 
$this->db->where('approved', 'y'); 
$this->db->where("(`description` LIKE '%$match%'"); 
$this->db->or_where("`title` LIKE '%$match%'"); 
$this->db->or_where("`body` LIKE '%$match%'"); 
$this->db->or_where("`author` LIKE '%$match%')"); 
$query = $this->db->get('story_tbl'); 

EDIT:

true AND true OR true OR true //true 
false AND true OR true OR true //true just like your where clause is ignored 
false AND false OR false OR true //Still true 
false AND true OR false OR false //false 
false AND false OR false OR false //false 

Więc to zapytanie zwróci wszystkich wierszy gdzie y zatwierdzone =” 'OR gdzie tytuł, treść odpowiada autor 'inny'

W moim pisał zapytania

true AND (true OR true OR true) //true 
false AND (true OR true OR true) //false, where clause is checked 
true AND (false OR false OR false) //false 
true AND (true OR false OR false) //true 

Która zwróci wiersze, w których zatwierdzono = "y", a także tytuł lub treść, autor lub opis pasuje do "innego". Wierzę, że właśnie to chcesz osiągnąć.

+0

Dlaczego chciałbym te nawiasy? To jest sposób w jaki codeigniter drukuje go na stronie, a querry powyżej tego, który napisałem, wciąż ignoruje moją pierwszą klauzulę where. Jestem zdezorientowany, dlaczego lepiej byłoby użyć $ this-> db-> querry nad aktywnymi rekordami? – zazvorniki

+0

Klauzula where jest ignorowana z powodu braku wspornika. Musisz zrozumieć, w jaki sposób AND, OR działa. – sakibmoon

+0

Rozumiem, jak działają, ale kiedy wkleiłem powyższy kod, daje mi to błąd 500. 'symbole nie powinny czynić różnicy – zazvorniki