【问题标题】:unset session on direct access to a function in codeigniter取消直接访问 codeigniter 中函数的会话
【发布时间】:2013-09-19 00:34:40
【问题描述】:

我的控制器中有 2 个函数,我使用第一个函数向第二个函数发送会话。我说的是:

public function search()
{

    $search_term = $this->input->post('search_term');
    $this->session->set_userdata('search_term', $search_term);

    redirect('search_result/');

}

第二个功能:

function search_result()
{

    $search_term = $this->session->userdata('search_term');
    $data['search_term'] = $search_term;
    $this->load->view('includes/template', $data);

}

一切都很好,但问题是,我想阻止直接访问search_result() 函数。我的意思是,当用户直接调用search_result() 时,我想取消设置search_term 会话。我该怎么办?!

【问题讨论】:

    标签: codeigniter function


    【解决方案1】:

    在搜索功能中

    redirect('search_result/'.$this->session->userdata('search_term'));
    

    在 search_result 函数中

    function search_result()
    {
        if($this->uri->segment(3))
        {
            $search_term = $this->session->userdata('search_term');
            $data['search_term'] = $search_term;
            $this->load->view('includes/template', $data);
        }
        else
        {
            redirect('search_result/','refresh');
        }
    }
    

    希望对您有所帮助。如果您遇到任何问题,请告诉我。

    【讨论】:

    • 你知道吗?!当我使用 search() 函数时,它会设置用户数据并将其发送到 search_result() 。我使用分页类,所以我不能在search_result() 的末尾取消设置用户数据,因此每当我访问search_result() 时,它都会使用以前的userdata('search_term),直到会话自行到期!!!
    • 好的,然后不要取消设置会话值。但请确保当您移至其他功能时,请取消设置该值。
    • 我的意思是你上面提到的代码不正确!因为在搜索关键字之后,直到会话到期,每当我尝试访问 search_result() 时,userdata(search_term) 都不会返回 false!
    • 好的,那么请查看我的更新答案并让我知道状态。
    【解决方案2】:

    有很多方法可以做到这一点。这里有一些

    如果存在则附加一个 get 参数,然后搜索 else 重定向回来

    public function search()
    {
        $search_term = $this->input->post('search_term');
        $this->session->set_userdata('search_term', $search_term);
        redirect('search_result?status=1');
    }
    public function search_result()
    {
        $status =   $this->input->get('status');
        if(status == 1){
            $search_term = $this->session->userdata('search_term');
            $data['search_term'] = $search_term;
            $this->load->view('includes/template', $data);  
        }else{
            $this->session->unset_userdata('search_term');
            redirect('search');
        }
    }
    

    保护你的 seach_result 函数,不要让用户直接调用它。 使用 _ 将为您完成。
    Here 是您可以阅读的链接。

    public function search()
    {
        $search_term = $this->input->post('search_term');
        $this->session->set_userdata('search_term', $search_term);
        $this->_search_result($search_term);
    }
    function _search_result($keyword)
    {
        if(strlen($keyword)>0){
            $data['search_term'] = $keyword;
            $this->load->view('includes/template', $data);  
        }else{
            redirect('search');
        }
    }
    

    【讨论】:

    • 关于第一部分,我已将enable_query_strings 设置为false。所以我不能在 url 中有这样的东西。关于您所说的第二种方法,在这种情况下,用户甚至无法访问该功能!!!
    • 好吧,您可以使用段参数而不是像这样http://localhost/myapp/index.php/controllername/search/1 在第一部分中获取它,然后像这样$status = $this->uri->segment(3); 那样获取它。对于第二部分,search_result 只能通过搜索功能访问
    【解决方案3】:

    您可以使用flashdata:http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

    CodeIgniter 支持“flashdata”,即仅可用于下一个服务器请求的会话数据,然后自动清除。这些非常有用,通常用于信息或状态消息

    这是执行您要查找的操作的代码:

    public function search()
    {
    
        $search_term = $this->input->post('search_term');
        $this->session->set_flashdata('search_term', $search_term);
    
        redirect('search_result/');
    }
    
    function search_result()
    {
        $search_term = $this->session->flashdata('search_term') ? $this->session->flashdata('search_term') : '';
        $data['search_term'] = $search_term;
        $this->load->view('includes/template', $data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多