2013-01-24 59 views
0

在我的數據庫中,我有一堆產品。在我的產品表我有一個名爲active欄默認爲1(這意味着它是「積極」)當我刪除產品,而不是刪除該行的我只是改變活動列0Codeigniter DB選擇邏輯錯誤

我也有一個搜索功能通過名稱或描述等搜索產品。我使用codeigniter作爲框架。這是代碼我有生成查詢:

$search_query = $this->db->from('company_products') 
->where('company_products.active', 1) 
->or_like(array('name'=> $keywords, 'model'=> $keywords, 'brand'=> $keywords, 'description'=> $keywords)) 
->order_by('id', 'RANDOM') 
->get(); 

此代碼生成此MySQL查詢:

SELECT `company_products`.* 
FROM (`company_products`) 
WHERE `company_products`.`active` = 1 
AND `name` LIKE '%chair%' 
OR `model` LIKE '%chair%' 
OR `brand` LIKE '%chair%' 
OR `description` LIKE '%chair%' 

「刪除」的產物(改變有源列0)的產物仍然顯示後在搜索結果上。這就是我懷疑是怎麼回事的代碼:

(SELECT a product WHERE active = 1 - AND - name LIKE %search_string%) 
- OR - 
(SELECT a product WHERE model LIKE %search_string%) 
- OR - 
(SELECT a product WHERE brand LIKE %search_string%) 
- OR - 
(SELECT a product WHERE description LIKE %search_string%) 

但是,這是我想要的東西:

(SELECT a product WHERE active = 1) 

- AND - 

{ (SELECT a product WHERE model LIKE %search_string%) 
- OR - 
(SELECT a product WHERE model LIKE %search_string%) 
- OR - 
(SELECT a product WHERE brand LIKE %search_string%) 
- OR - 
(SELECT a product WHERE description LIKE %search_string%) } 

我希望我的僞代碼是不是太混亂。我想用codeigniter的活動記錄類來完成這個任務。

回答

1

活動記錄是不會做它自己,你需要組合這些或公司否則他們在整個查詢部分工作。您需要手動在複雜查詢中構建WHERE語句,在這些情況下我個人根本不打擾主動記錄,但如果您真的想使用它,可以這樣做:

$where = "`company_products`.`active` = 1 AND (`name` LIKE '%$keywords%' 
OR `model` LIKE '%$keywords%' OR `brand` LIKE '%$keywords%' OR 
`description` LIKE '%$keywords%')"; 
$search_query = $this->db->from('company_products') 
->where($where) 
->order_by('id', 'RANDOM') 
->get(); 
+0

你會爲安全做些什麼?逃避$關鍵字?用htmlspecialchars? 由於SQL注入等先前存在的安全性,我喜歡活躍的記錄。 – Xecure

+0

我可能是錯的,但我相信,因爲活動記錄仍然在構建查詢,它仍然像以前一樣使用它的方式逃脫。 –

0

使用括號:

SELECT `company_products`.* 
FROM (`company_products`) 
WHERE `company_products`.`active` = 1 
AND (`name` LIKE '%chair%' 
OR `model` LIKE '%chair%' 
OR `brand` LIKE '%chair%' 
OR `description` LIKE '%chair%') 

在MySQL(基本上適用於所有RDBMS)閱讀Operator Precedence

+0

他聲明他想繼續使用CI的活動記錄來做他的查詢。 –

+0

我認爲CI應該允許以某種方式將條件分組。在我的回答中,許多其他查詢構建器都允許這樣做 – cha

+0

。 –