2012-05-25 200 views
0
$all = $this->input->get('all'); 

    if($all) 
    { 
     $keywords = $this->input->get('search'); 
     $data['search'] = $keywords; 
     $this->session->set_flashdata('search', $keywords); 
     $query = "SELECT * FROM `investOffers`, `news`"; 
     $counts = "SELECT count(*) as count FROM `investOffers`, `news`"; 
     $first = false; 
     if($keywords) 
     { 
      $data['keywords'] = $keywords; 
      $this->session->set_flashdata('keywords', $keywords); 
      $keywords = explode(" ", $keywords); 
      foreach($keywords as $k) 
      { 
       if(!$first) 
       { 
        $query .= " WHERE investOffers.desc LIKE '% ".$k." %' OR investOffers.title LIKE '% ".$k." %'"; 
        $query .= " OR news.desc LIKE '% ".$k." %' OR news.title LIKE '% ".$k." %'"; 
        $counts .= " WHERE investOffers.desc LIKE '% ".$k." %' OR investOffers.title LIKE '% ".$k." %'"; 
        $counts .= " OR news.desc LIKE '% ".$k." %' OR news.title LIKE '% ".$k." %'"; 
        $first = true; 

       } 
       else 
       { 
        $query .= " OR investOffers.desc LIKE '% ".$k." %' OR investOffers.title LIKE '% ".$k." %'"; 
        $query .= " OR news.desc LIKE '% ".$k." %' OR news.title LIKE '% ".$k." %'"; 
        $counts .= " OR investOffers.desc LIKE '% ".$k." %' OR investOffers.title LIKE '% ".$k." %'"; 
        $counts .= " OR news.desc LIKE '% ".$k." %' OR news.title LIKE '% ".$k." %'"; 
       } 
      } 


     } 
      $page = $this->uri->segment(2); 
      if($page) 
      { 
       $query .= " ORDER BY investOffers.date DESC LIMIT ".$page.", 10"; 
       $counts .= " ORDER BY investOffers.date DESC LIMIT 10"; 
      } 
      else 
      { 
       $query .= " ORDER BY investOffers.date DESC LIMIT 10"; 
       $counts .= " ORDER BY investOffers.date DESC LIMIT 10"; 
      } 
     $data['query'] = $this->db->query($query); 
     $counts = $this->db->query($counts); 
     foreach($counts->result() as $q) 
     { 

     $count = $q->count; 
     break; 

     } 
     $config['base_url'] = base_url().'/search'; 
     $config['prev_link'] = false; 
     $config['next_link'] = false; 
     $config['last_link'] = false; 
     $config['first_link'] = false; 
     $config['suffix'] = '?'.http_build_query($_GET, '', "&"); 
     $config['cur_tag_open'] = '<strong><img src="'.IMAGE.'pagerArrow.png" class="pagerArrow" />'; 
     $config['cur_tag_close'] = '</strong>'; 
     $from = intval($this->uri->segment(2)); 
     $config['per_page'] = 10; 
     $config['num_links'] = 5;  
     $config['uri_segment'] = 2; 
     $config['total_rows'] = $count; 
     $this->pagination->initialize($config); 
     $data['pager'] = $this->pagination->create_links(); 
     $data['content'] = $this->load->view(SITE.'search', $data, true); 
     $this->load->view(SITE.'layout', $data); 
     return true; 

    } 

所以這是一個搜索查詢,首先我們檢查一下搜索是否是「全部」,這意味着搜索的所有網站,所以然後我做一個由空格分隔的關鍵字數組,輸入表單,所以然後我把它放在視圖中的preg_match的flash會話中,這是爲了preg_match在生成結果的視圖中突出顯示文本,所以然後我使查詢的串聯添加更多的LIKE,所以問題是當我輸入1個關鍵字時,它給了我不同的結果和它的okey,但是當我輸入2或多個關鍵字時,它給了我相同的結果,我的意思是結果列表完全相同,我不明白爲什麼是這樣,在它的視圖中所有沒關係,問題是在這個地方的代碼,我試圖在查詢中設置第DISTINCT關鍵字,但它並沒有幫助...爲什麼我會得到相同的結果?

PS:這就是笨,MVC,這是一個控制器,我不使用的機型,因爲我不想打開多個文件:)

+4

爲什麼你不看看生成的查詢,看看有什麼不對嗎?這段代碼長得太大了,無法在週五晚些時候閱讀。 –

+0

首先我看到你的SQL語句不對。你做了2個表的交叉連接,但沒有加入語句。'investOffers'和'news'表之間的關係是什麼? – bksi

+0

沒有關係,它們是不同的表格,它是搜索所有網站的地方,以及我在哪裏可以看到生成的代碼以及如何查看問題所在?我只想在一個視圖中生成所有結果 – BlareStriker

回答

1

檢查您

$keywords = explode(" ", $keywords); 

正在恢復長度大於1.由於您從GET獲取了$關鍵字,因此您可能需要在將變量傳遞給爆炸函數之前對其進行urldecode。

$keywords = urldecode($keywords); 
+0

mmmm,也許您是對的,現在我會檢查一下,感謝您的諮詢! – BlareStriker

0

首先,我認爲你應該使用CI Active Record。它做了很多轉義,以防止類似SQL Injection。我不是安全專家,但我認爲你的代碼很脆弱。除此之外,CI Active Record還有Active Record Caching,在這種情況下這將很有用,因爲您在選擇和計算時使用相同的WHERE事物。

要調試,你可以看看最後一個查詢通過echo $this->db->last_query();

在代碼中,我注意到你之前和關鍵字"LIKE '% {$keyword} %'"後留下的空間。這是你的意圖嗎?我認爲你的代碼會錯過關鍵字在主題開始或結束時的情況。我認爲這可能是你尋找的原因。

+0

我已經這麼做了,因爲我只想得到一個單詞,而不是文本中的一個子串,所以ia已經創建了一個左側空間和一個右側空間,是否有一種方法只能找到完整的單詞,而不是一個單詞中的子串喜歡?? – BlareStriker

+0

你應該嘗試像查詢'SELECT * FROM foo其中foo.bar REGEXP '[[:<:]] keyword_here [[:>:]]';'另外,我不認爲@ user1418338解決方案的工作。我相信Input Class爲你做了urldecode。如果你要求'?key = foo + bar',那麼'($ this-> input-> get('key')=='foo bar')=== TRUE'。 – Rocco

0

你的查詢完全錯誤。 如果使用

SELECT * FROM table1, table2 

你讓這兩個表和結果之間的交叉連接不正確。 如果你想從結構相似的多個表的結果,你應該使用UNION狀態,而不是:

SELECT field1, field2, field3 FROM table1 
UNION 
SELECT field1, field2, field3 FROM table2 

如果你想使用WHERE子句,你可以做2種方式: 1:

SELECT field1, field2, field3 FROM (
SELECT field1, field2, field3 FROM table1 
UNION 
SELECT field1, field2, field3 FROM table2) as tt 
WHERE your where conditions 

在這種情況下,你可以命令並限制從表名導致獨立

2:

SELECT field1, field2, field3 FROM table1 
WHERE your where conditions 
UNION 
SELECT field1, field2, field3 FROM table2 
WHERE your where conditions 

這樣你就會取得正確的結果。 有關UNION狀態的更多信息,您可能會收到在http://dev.mysql.com/doc/refman/5.0/en/union.html

相關問題