こんにちはCodeIgniterでサイトを開発しています。
私のページの1つで、検索フォームの後にCodeIgniterのページネーションを使用しています。
この場合、$_POST
によって渡された検索値をセッションに保存します。次のページをクリックしてさらに結果が得られる場合、検索は検索値をケッペするからです。
しかし、たとえばページを変更すると、インデックスに戻り、検索フォームページに戻った後、セッションが既に作成され、セッションの値を使用してクエリが作成されます。ページを変更するときにセッションの値を破棄または設定解除するにはどうすればよいですか?これは可能ですか?
私のモデル関数では、セッション値が0と異なるかどうかを確認し、存在する場合はセッション値でクエリを作成します。
これは私のコントローラーです(国はセッションに格納する値です)
public function region_list(){
$this->load->model('backend/Nation_model');
$this->load->library("pagination");
if($_POST)
{
if (isset($_POST['ricerca'])){
$nation = $this->input->post('nation');
if(strlen($nation) > 0){
$this->session->set_userdata('nation',$nation);
}
$config = array();
$config["base_url"] = base_url() . "index.php/backend/region/region_list";
$config["total_rows"] = $this->Region_model->countRegionSearch();
$config["per_page"] = 10;
$config["uri_segment"] = 4;
$this->pagination->initialize($config);
$page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$data["regionlist"] = $this->Region_model->regionSearch($config["per_page"], $page);
$data["links"] = $this->pagination->create_links();
$data["nationlist"] = $this->Nation_model->nationList();
$this->load->view('backend/region_list_view',$data);
}
}
else
{
$config = array();
$config["base_url"] = base_url() . "index.php/backend/region/region_list";
$config["total_rows"] = $this->Region_model->countRegion();
$config["per_page"] = 10;
$config["uri_segment"] = 4;
$this->pagination->initialize($config);
$page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$data["links"] = $this->pagination->create_links();
$data["regionlist"] = $this->Region_model->regionList($config["per_page"], $page);
$data["nationlist"] = $this->Nation_model->nationList();
$this->load->view('backend/region_list_view',$data);
}
}
これは私の検索モデルです:
function regionList($limit=null, $start=null) {
$nation_id = $this->session->userdata('nation');
if ($this->session->userdata('language')=="it")
$this->db->select('region.id, region.name_it as name,nation.id as nation_id, nation.name_it as nation_name');
if ($this->session->userdata('language')=="en")
$this->db->select('region.id, region.name_en as name,nation.id as nation_id, nation.name_en as nation_name');
$this->db->from('region');
$this->db->join('nation', 'region.nation_id = nation.id','left');
if((isset($nation_id))&&($nation_id!=0))
$this->db->where('region.nation_id', $nation_id);
$this->db->order_by("name", "asc");
$this->db->limit($limit, $start);
$query = $this->db->get();
$region = array();
foreach ($query->result() as $row)
array_Push($region, $row);
return $region;
}
function countRegion() {
$nation_id = $this->session->userdata('nation');
if ($this->session->userdata('language')=="it")
$this->db->select('region.id, region.name_it as name,nation.id as nation_id, nation.name_it as nation_name');
if ($this->session->userdata('language')=="en")
$this->db->select('region.id, region.name_en as name,nation.id as nation_id, nation.name_en as nation_name');
$this->db->from('region');
$this->db->join('nation', 'region.nation_id = nation.id','left');
if((isset($nation_id))&&($nation_id!=0))
$this->db->where('region.nation_id', $nation_id);
$this->db->order_by("name", "asc");
$query = $this->db->get();
return $query->num_rows();
}
public function regionSearch($limit=null, $start=null){
$nation_id = $this->session->userdata('nation');
if ($this->session->userdata('language')=="it"){
$this->db->select('*,region.id, region.name_it as name,nation.id as nation_id, nation.name_it as nation_name');
if($this->input->post('name')!="")
$this->db->where('region.name_it LIKE "%'.$this->input->post('name').'%"');
}
if ($this->session->userdata('language')=="en"){
$this->db->select('*,region.id, region.name_en as name,nation.id as nation_id, nation.name_en as nation_name');
if($this->input->post('name')!="")
$this->db->where('region.name_en LIKE "%'.$this->input->post('name').'%"');
}
$this->db->from('region');
$this->db->join('nation', 'region.nation_id = nation.id','left');
if((isset($nation_id))&&($nation_id!=0))
$this->db->where('region.nation_id', $nation_id);
$this->db->order_by("name", "asc");
$this->db->limit($limit, $start);
$query = $this->db->get();
$region = array();
foreach ($query->result() as $row)
array_Push($region, $row);
return $region;
}
public function countRegionSearch(){
$nation_id = $this->session->userdata('nation');
if ($this->session->userdata('language')=="it"){
$this->db->select('*,region.id, region.name_it as name,nation.id as nation_id, nation.name_it as nation_name');
if($this->input->post('name')!="")
$this->db->where('region.name_it LIKE "%'.$this->input->post('name').'%"');
}
if ($this->session->userdata('language')=="en"){
$this->db->select('*,region.id, region.name_en as name,nation.id as nation_id, nation.name_en as nation_name');
if($this->input->post('name')!="")
$this->db->where('region.name_en LIKE "%'.$this->input->post('name').'%"');
}
$this->db->from('region');
$this->db->join('nation', 'region.nation_id = nation.id','left');
if((isset($nation_id))&&($nation_id!=0))
$this->db->where('region.nation_id', $nation_id);
$this->db->order_by("name", "asc");
$query = $this->db->get();
return $query->num_rows();
}
あなたの質問に答える:
セッションの値を破棄または設定解除するにはどうすればよいですか?
これであなたを助けることができます:
$this->session->unset_userdata('some_name');
また、複数のデータの場合:
$array_items = array('username' => '', 'email' => '');
$this->session->unset_userdata($array_items);
セッションを破棄するには:
$this->session->sess_destroy();
次に、ページの変更部分について(頭の中で):
config "anchor_class"のpaginatorをclassnameに設定できます。
その後、そのクラスのjquery onclickで確認します。これにより、ユーザーセッションを設定解除するコントローラー関数にヘッドが送信されます。
Set_userdataを使用する代わりに、set_flashdataを使用する必要があります。
CIユーザーガイドによると:
CodeIgniterは、「flashdata」、または次のサーバーリクエストでのみ使用可能なセッションデータをサポートし、自動的にクリアされます。これらは非常に便利な場合があり、通常は情報メッセージまたはステータスメッセージに使用されます(たとえば、「record 2 deleted」)。
http://ellislab.com/codeigniter/user-guide/libraries/sessions.html
$session_data = array('username' =>"shashikant");
$this->session->set_userdata('logged_in', $session_data);
$this->session->unset_userdata('logged_in');
$this->session->unset_userdata('session_value');
私は古いPHP way..Itを使用します。すべてのセッション変数の設定を解除し、配列でそれらをそれぞれ指定する必要はありません。変数を設定解除した後、セッションを破棄します。
session_unset();
session_destroy();