2012-05-01 41 views
1

我正在編寫一些腳本,我想創建搜索。我的項目基於CodeIgniter,我的願望是讓所有代碼內容與它兼容。CodeIgniter - 搜索結果 - 如何創建好的查詢和URI?

所以,我已經在尋找查詢,但它不好,因爲它不支持更多的單詞。因此,如果我在搜索表單中輸入單詞「test」(假設測試單詞在數據庫中的某個字段中),那麼結果會很少,但如果我輸入單詞「test test test」(再假設測試單詞是在其中一個字段中的數據庫中)將不會有任何結果。

我當前的查詢:

$this->db->select('title, content, date, hyperlink')->or_like(array('title' => $query, 'content' => $query))->order_by('id_article', 'desc')->get('news');

下一個問題是URI,因爲如果我搜索「的一些文章,今天是晴天」有是逗號和在其他情況下可能與其他不允許的字符問題太。我在那裏讀了其他幾個問題,但是我發現的所有內容都是$this->uri->uri_to_assoc(),在我的案例中,我認爲這是行不通的,因爲我的項目中沒有使用英語。

這兩個問題的最佳解決方案是什麼?

+0

嘗試放入先前創建的查詢 – ZiTAL

+0

對於初學者,我認爲你應該將'or_like'改爲'like'。如果你真的想在標題或內容中搜索,你應該把它們分成兩個:'$ this-> like('title',$ query) - > or_like('content',$ query)'。 – Zombaya

+0

另外,如果在執行查詢後執行'$ this-> db-> last_query();',您可以在此報告您的有效mysql查詢的樣子。 – Zombaya

回答

1

要解決搜索問題,您應該將查詢分解爲多個部分。

$query = 'test test 2 test3'; 
$parts = explode(' ', $query); 

然後遍歷零件並添加or_like條件。

foreach ($parts as $q) 
{ 
    $this->db->or_like(array('title' => $q, 'content' => $q)); 
} 

現在它檢查任何單詞。

您可能還希望允許將引用的值視爲一個單詞,以便「測試2」將搜索序列測試2而不僅僅是測試和2.您需要調整如何獲得零件,可能是像正則表達式:

preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $query, $parts); 

至於URI中的無效字符,通過進行urlencode通過在一端上的串然後urldecode另一方。

$uri = urlencode('some article, today is sunny'); 
+0

爆炸詞的想法是好的,但是這是在某種程度上好,在其他沒有。目前是我的功能類似: '函數show_results_news($查詢) \t { \t \t $ shwresnws = $這個 - > DB->選擇( '標題,內容,日期,超鏈接') - > or_like(陣列( 'title'=> $ query,'content'=> $ query)) - > order_by('id_article','desc') - > get('news'); \t \t return $ shwresnws; \t}' 在我現在需要用foreach來改變它嗎? 我也在用urlencode嘗試,但結果是:'一些+文章%2C +今天+是+陽光'也有不允許的字符,它不起作用。 – user1257255