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 のフラッシュ セッション。これは、生成された結果のビュー内のテキストを強調表示する preg_match 用です。そのため、クエリを連結して LIKE を追加します。問題は、1 つのキーワードを入力すると、異なる結果が得られることです。大丈夫ですが、2つまたは多くのキーワードを入力すると、同じ結果が得られます。つまり、まったく同じ結果のリストが表示されます。なぜそれがビューですべて大丈夫なのか理解できません。問題コードのこの場所にあります。クエリで DISTINCT キーワードを設定しようとしましたが、役に立ちません...

ps:これはcodeigniter、MVC、これはコントローラーです。多くのファイルを開きたくないので、モデルは使用しません:)

4

3 に答える 3

1

あなたの

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

は1より大きい長さを返します。GETから$keywordsを取得しているため、変数をexplode関数に渡す前に変数をurldecodeする必要がある可能性があります。

$keywords = urldecode($keywords);
于 2012-05-25T22:33:52.733 に答える
0

あなたの質問は完全に間違っています。使用する場合

SELECT * FROM table1, table2

これら2つのテーブル間でクロス結合を行うと、結果が正しくありません。同様の構造を持つ複数のテーブルから結果を取得する場合は、代わりに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を参照してください。

于 2012-05-25T23:20:12.273 に答える
0

まず、CI Active Recordを使うべきだと思います。SQL インジェクションのようなものを防ぐために、多くのエスケープを行います。私はセキュリティの第一人者ではありませんが、あなたのコードは脆弱だと思います。さらに、CI Active Record にはActive Record Cachingもあり、選択とカウントに同じ WHERE を使用しているため、この場合に役立ちます。

デバッグするには、次の方法で最後のクエリを確認できますecho $this->db->last_query();

あなたのコードでは、キーワードの前後にスペースが残っていることに気付きました"LIKE '% {$keyword} %'"。それはあなたが意図したものですか?あなたのコードは、キーワードが件名の最初または最後にあるケースを見逃すと思います。それがあなたが探している理由かもしれないと思います。

于 2012-05-25T22:43:55.587 に答える