2016-10-07 50 views
3

我正在用Codeigniter的某些数据设计搜索功能。

我的搜索模式是这样的:

class Search_Model extends CI_Model { 

     public function get_results($search_terms = false) { 

      // Build query 
      foreach ($search_terms as $field => $value) { 
       $this->db->like("{$field}", $value); 
      } 

      // Execute query 
      $query = $this->db->get('exams'); 

      // Return results 
      return $query->result_array(); 
     } 
} 

而且搜索控制方法是这样的:

public function results() { 

      $search_terms = array(
       'first_name' => $this->input->get('first_name', TRUE), 
       'last_name' => $this->input->get('last_name', TRUE), 
       'exam_name' => $this->input->get("exam_name", TRUE) 
      ); 

      $data['title'] = "Search Results"; 
      $data['exams'] = $this->search_model->get_results($search_terms); 

      $this->load->view('templates/header.php', $data); 
      $this->load->view('exams/index.php', $data); 
      $this->load->view('templates/footer.php'); 
} 

的搜索工作,因为它应该,但我要清理其自带的网址如果我只搜索“名字”:

search/results?first_name=tim&last_name=&exam_name= 

如何删除tho是否在URL中未使用额外的参数?

+0

你设置得URL? –

+0

我有搜索控制器中的索引方法,将表单方法设置为GET,因为我想查看URL –

+1

中的搜索条件,只需使用jquery即可。首先在你的问题中添加你的表单代码.. –

回答

0

包括jQuery的在你的头。然后添加此脚本。

<script> 
$(document).ready(function(){ 
    $('#myform').submit(function(event){ 
     event.preventDefault(); 
     var url = $(this).attr('action')+'?'; 
     var first = false; 
     var second = false; 
     if($('input[name="first_name"]').val()){ 
      url += 'first_name='+$('input[name="first_name"]').val(); 
      first = true; 
     } 
     if($('input[name="last_name"]').val()){ 
      if(first){ 
       url += '&'; 
      } 
      url += 'last_name='+$('input[name="last_name"]').val(); 
      second = true; 
     } 
     if($('input[name="exam_name"]').val()){ 
      if(second){ 
       url += '&'; 
      } 
      url += 'exam_name='+$('input[name="exam_name"]').val(); 
     } 
     window.location.replace(url); 
    }); 
}); 
</script> 

(我没有跑这个脚本呢,所以让我知道如果u得到任何语法错误或其他somethign) 终于改变你的结果函数来此,

public function results() { 

      $search_terms = array(); 

      if(isset($_GET['first_name'])){ 
       $search_terms['first_name'] = $this->input->get('first_name', TRUE); 
      } 
      if(isset($_GET['last_name'])){ 
       $search_terms['last_name'] = $this->input->get('last_name', TRUE); 
      } 
      if(isset($_GET['exam_name'])){ 
       $search_terms['exam_name'] = $this->input->get('exam_name', TRUE); 
      } 

      $data['title'] = "Search Results"; 
      $data['exams'] = $this->search_model->get_results($search_terms); 

      $this->load->view('templates/header.php', $data); 
      $this->load->view('exams/index.php', $data); 
      $this->load->view('templates/footer.php'); 
} 
+0

我刚到家,并能够尝试这一点。尝试这个解决方案后,这是实际工作。 Yada的答案确实通过PHP数组进行筛选,但参数仍显示在URL中。使用JS重新格式化的网址很好! –

+0

@TimothyFisher:非常感谢你的尝试。我很高兴知道这解决了你的问题。并为误会感到抱歉。只是想知道谁没有任何理由被低估了。不管怎样,谢谢。 –

4

最快的方法就是在将$ searh_terms数组传递给模型之前对其进行过滤。

$search_terms = array(
    'first_name' => $this->input->get('first_name', TRUE), 
    'last_name' => $this->input->get('last_name', TRUE), 
    'exam_name' => $this->input->get("exam_name", TRUE) 
); 

// Remove empty search values 
foreach ($search_terms as $key => $value) { 
    if (strlen($value) == 0) { 
     unset($search_terms[$key]); 
    } 
} 
+0

'submit = submit_button_value'呢?有什么办法可以将它从URL中隐藏起来(第一次提交表单时)? –

+1

'array_filter'不会做同样的事情吗? –

+0

这对我来说最合适。我也会研究'array_filter',谢谢大家的建议! –

-1

你可以试试这个:

$mode = array(); 
    if(isset($_GET['first_name'])): 
     $mode[] = 'first_name='.$_GET['first_name']; 
    endif; 

    if(isset($_GET['last_name'])): 
     $mode[] = 'last_name='.$_GET['last_name']; 
    endif; 

    if(isset($_GET['exam_name'])):  
     $mode[] = 'exam_name='.$_GET['exam_name']; 
    endif; 

    //etc... 

    //Then reformulate link 
    if(!empty($mode)){ 
     $link = '?' . implode('&',$mode); 
    }else{ 
     $link = ''; 
    } 

    redirect("form.php".$link); 
-1

只是过滤,你送什么......

foreach ($search_terms as $field => $value) { 
      if ($value <> ""){ //or the test you like to use... 
       $this->db->like("{$field}", $value); 
      } 
     } 
相关问题