2012-05-25 36 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

相关问题