Codeigniter:在不使用$ _GET的情况下实现搜索过滤器

时间:2011-01-24 14:26:27

标签: php search codeigniter codeigniter-url

我有一个应用程序,其中包含一个名为项目的表,我希望能够搜索到这些项目。我更喜欢使用现有方法来调用模型来获取查询结果。所以我刚才的URL格式是example.com/projects/id/slug,所有项目只是example.com/projects。我想要一个搜索表单,将关键字作为字符串传递给方法。

我知道CI默认情况下不允许$ _GET:

从CodeIgniter的手册中了解安全性:

  

GET,POST和COOKIE数据

     

GET数据是完全不允许的   CodeIgniter自系统使用以来   URI段而不是传统的   URL查询字符串(除非你有   启用查询字符串选项       在你的配置文件中)。 Input类未设置全局GET数组   在系统初始化期间。

我的问题是如何使用多个关键字以这种方式使用URI细分?

我可以执行搜索/关键字+ secondkeyword + thirdkeyword之类的操作吗?

无论如何,使用表单将文本框中的关键字转换为上述格式?

谢谢,

比利

3 个答案:

答案 0 :(得分:3)

如果你想这样做......

你可以做这样的事情,假设有多个帖子输入并且它们仅用于搜索,它可能看起来像这样

function search(){

  $url = $this->uri->segment(2);

  if(empty($url)){
      if((isset($_POST) && (!empty($_POST))
      {
         $search_seg = '';

         foreach($_POST as $k => $v){
             // I always make sure to use the CI post w/ 
             // TRUE set in the second param so as to XSS filter the user input
             $var = $this->input->post($k, TRUE);
             // Just incase the user input had a plus in it?
             $var = str_replace('+', '%20', $var)
             // Concatenate the search string
             $search_seg .= $var . '+';
         }

         // Make the url, use substr() to strip the last + off the end 
         $search_seg = 'search/' . substr($search_seg, 0, -1);

         /* Make sure CI's URL helper is enabled
            $this->load->helper('url'); if it hasn't been loaded
            This will give the illusion that the form post went to this URL,
            thus doing what you're looking for... */
         redirect($search_seg, 'location');

      }else{
         // There was no post, do whatever
      }
  }else{
      $search_arr = explode('+', $url);
  }

上面应该完全按照你的描述进行操作,尽管有很多方法可以重新创建$ _GET数组并仍然使用CI样式的URL,尽管这有点复杂

附加信息:

如果只有一个搜索输入字段,比如说,这些术语是用空格分隔的,那么你可能想这样做(可能有一些正则表达式过滤)...用foreach($_POST as $k => $v)...循环替换这样:

$keywordinput = $this->input->post('keywords', TRUE);
$keywordinput = trim($keywordinput);

$keywords = explode(' ', $keywordinput);

foreach($keywords as $word){
    if(!empty($word)){
       $word = str_replace('+', '%20', $var)
       $search_seg .= $word . '+';
    }
}

答案 1 :(得分:0)

使用$ _POST可能是复杂查询的更好选择,但这可能有效,但要求URI具有特定的参数顺序(可能有更好的方法)

/*controller/method/params = search/do_search/Ross/Red/Male */

function do_search($name, $colour, $gender)
{
    $this->db->or_where('name', $name);
    $this->db->or_where('colour', $colour);  
    $this->db->or_where('gender', $gender);
    // etc
}

不是非常可扩展或灵活,但对于简单的搜索,这可能就足够了。

答案 2 :(得分:0)

如果你想让你的网址像这样 -

search/keyword+secondkeyword+thirdkeyword? 

并且还希望它是可收藏的,然后使用javascript只是我猜的选项。

使用javascript你可以在#之后在url中设置搜索参数,所以最终的网址将是这样的 -

search#keyword+secondkeyword+thirdkeyword

如果你使用这种方法,这意味着你将通过ajax加载你的搜索结果,即每当遇到一个网址时,你将通过javascript从网址哈希后得到搜索关键字。通过ajax加载结果并显示结果。如果更改了搜索条件,则每次需要使用javascript将哈希后的新关键字附加到网址时。

在#之后获取url参数的基本javascript代码如下 -

var parameters = window.location.hash;