【问题标题】:How to validate Session in codeigniter?如何在codeigniter中验证会话?
【发布时间】:2014-01-20 08:46:38
【问题描述】:

我正在尝试在 Codeigniter 中创建一个会话。我已经在自动加载中加载了 sessionencrypt 库。默认情况下,login.php 页面打开。如果用户已经登录,我想打开 dashboard.php 页面。我编写了以下代码,但它打开 login.php 页面,即使在登录后也是如此。

请告诉我如何检查会话是否已设置。

 public function index()
{          
   $data['products_data']= $this->products_model->all_products(); 
           //   $this->load->view('login');

   $this->form_validation->set_rules('username','Username','required');
   $this->form_validation->set_rules('password','Password','required');

    if ($this->form_validation->run()== false)
   {
       $this->load->view('login');           
   }
   else
   {
        if ($this->session->userdata('login_status')) {

            $this->load->view('header');
            $this->load->view('dashboard');
            $this->load->view('footer');

        }
        else
        {
            $username=   $this->input->post('username');
            $password=   $this->input->post('password');  

             if( $this->products_model->login_model($username,$password))
             {
               $sess_data= array(
                                'username'=> $username,
                                'login_status'=>'1'
                                );

                $session_data   =   $this->session->set_userdata($sess_data);                    

                $this->load->view('header');
                $this->load->view('dashboard');
                $this->load->view('footer');

             }

        }
   }


}

【问题讨论】:

    标签: php codeigniter session


    【解决方案1】:
    $sessdata = $this->session->set_userdata($session_data);
    if (isset($sessdata))
    {
    //session exists
    }
    else{
    // no session value
    }
    

    因此,您的控制器应如下所示,以避免在页面刷新时重定向到登录页面,

    function index() {
        if ($this->session->userdata('login_status')) {
            //write your code for redirect to dashboard
        } else {
            $data['products_data'] = $this->products_model->all_products();
            $this->form_validation->set_rules('username', 'Username', 'required');
            $this->form_validation->set_rules('password', 'Password', 'required');
            if ($this->form_validation->run() == false) {
    
                $this->load->view('login');
            } else {
                $username = $this->input->post('username');
                $password = $this->input->post('password');
                if ($this->products_model->login_model($username, $password)) {
                    $sess_data = array(
                        'username' => $username,
                        'login_status' => '1'
                    );
                    $session_data = $this->session->set_userdata($sess_data);
                    //write your code for redirect to dashboard
                }
            }
        }
    }
    

    【讨论】:

    • 我已经更新了我的代码。仍然登录后,当我刷新页面时,它会将我发送回 login.php ..现在登录后打开一个空白页面。请检查一下。谢谢
    • if($this->products_model->login_model($username,$password)) { }else{//your login code}。检查您的 if 条件是真还是假。在其为真之后,将只检查会话验证。
    • @AftabAamir 否则代码中的部分不是为isset($sessdata) 编写的。它是为你的login_model()写的。
    • @AftabAamir 只需在 if( $this->products_model->login_model($username,$password)){} 中回显示例文本,然后尝试打印或重定向到登录表单。如果它重定向到登录页面,则 if($this->products_model->login_model($username,$password)) 条件为 false。不是 if ($this->session->userdata('login_status')) 条件
    • @AftabAamir 检查更新的答案您将了解为什么您的页面在页面刷新时重定向到登录页面。
    【解决方案2】:

    删除单个 qoutes

    $this->session->set_userdata('$sess_data');

    它将变量$sess_data 视为常规字符串。

    必须是:

    $this->session->set_userdata($sess_data);

    【讨论】:

    • 谢谢,我已经更新了我的代码,现在它成功登录并打开了 dashboard.php,但是当我重新访问 login.php 时,它打开了登录表单,并没有将我重定向到仪表板.
    【解决方案3】:

    我更喜欢为仪表板创建另一个控制器,并在成功登录后将其重定向到那里。它很干净,您可以轻松地进行进一步的更改

    if( $this->products_model->login_model($username,$password))
    {
        $sess_data= array(
            'username'=> $username
        );
    
        $session_data   =   $this->session->set_userdata($sess_data);
    
        if(isset($session_data))
             redirect(site_url('/dashboard/'));
    
    }
    

    FM:$sess_data 不应使用单引号

    【讨论】:

    • 如果我使用重定向,那么我将如何加载页眉和页脚视图?
    • 在仪表板控制器的索引函数中编写以下代码 $this->load->view('header'); $this->load->view('dashboard'); $this->load->view('footer');所以当你降落在那里时,页眉和仪表板和页脚将被加载
    【解决方案4】:

    我将使用 session 记录登录状态。

    $session_data= array(
        'username'=> $username,
        'lgoin_status' => 1
    );
    
    $this->session->set_userdata('$session_data');
    

    我会检查会话的login_status

    if ($this->session->userdata('login_status')) {
        // do something
    }
    

    编辑

    在你的代码上,你应该首先检查会话,所以..

    public function index()
    {   
       if ($this->session->userdata('login_status')) 
       {
          // do something
       }
       else 
       {
    
       $data['products_data']= $this->products_model->all_products();  
    
       $this->form_validation->set_rules('username','Username','required');
       $this->form_validation->set_rules('password','Password','required');
    
       if ($this->form_validation->run()== false)
       {
           $this->load->view('login');           
       }
       ...
    }
    

    【讨论】:

    • 谢谢,我已经更新了我的代码,现在它成功登录并打开了dashboard.php,但是当我重新访问 login.php 时,它打开了登录表单,并没有将我重定向到仪表板.
    • 您可以在login 控制器的indexcontructor 方法上检查会话,然后重定向。
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多