【问题标题】:Session data ci3 base controller会话数据 ci3 基本控制器
【发布时间】:2017-05-23 05:25:48
【问题描述】:

我在名为 pages 的控制器上有这个(我用它作为终端来分支到所有视图)

class pages extends MY_Controller 
{
    public function verification()
    {
        $session_data = $this->is_logged_in();

        print_r($session_data);

        if($this->is_logged_in())
        {

        }
    }
}

如您所见,我在 session_data 上有一行“print_r”,我得到了一些结果,问题是它总是只返回“1”。

这是我的基本控制器上的功能。

class MY_Controller extends CI_Controller 
{
    public function __construct()
    {
        parent::__construct();
    }
    
    public function is_logged_in()
    {
        $user = $this->session->userdata();
        return isset($user);
    }  
}

这是登录后在我的身份验证器控制器上创建会话数据后的代码块。

Class user_authentication extends MY_Controller 
{
    public function register()
    {
        $this->form_validation->set_rules('username', 'Username','required|trim|min_length[8]|max_length[24]|is_unique[user.username]', [
            'required' => 'You have not provided %s.', 
            'is_unique' => 'This %s already exists.'
        ]);    
        $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[16]');
        $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email|min_length[6]|max_length[30]|is_unique[user.email]', [
            'required' => 'You have not provided %s. ', 
            'is_unique' => 'This %s already exists.'
        ]);
            $this->form_validation->set_rules('type', 'Account Type', 'trim|required|min_length[1]|max_length[1]', [
            'required' => 'please select: 1 - normal, 2 - trainer'
        ]);
        
        $this->form_validation->set_error_delimiters('', '');

        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('templates/header');
            $this->load->view('templates/navigation');
            $this->load->view('pages/login');
            $this->load->view('templates/footer');
        }
        else
        {
            $data = [
                'username' => $this->input->post('username'),
                'password' => $this->input->post('password'),
                'email' => $this->input->post('email'),
                'type' => $this->input->post('type'),
            ]; 
            
            $result = $this->Account_model->create_account($data);

            if($result == true)
            {
                $data['message_display'] = 'Registration Successful';

                $this->load->view('templates/header');
                $this->load->view('templates/navigation');
                $this->load->view('pages/homepage',$data);
                $this->load->view('templates/footer');    
            }
            else
            {
                $data['message_display'] = 'Username and/or Email already exists';

                $this->load->view('templates/header');
                $this->load->view('templates/navigation');
                $this->load->view('pages/login',$data);
                $this->load->view('templates/footer');
            }
        }
    }
    
    public function login()
    {
        $this->form_validation->set_rules('username', 'Username', 'required|trim|min_length[8]|max_length[24]');
        $this->form_validation->set_rules('password', 'Password', 'required|trim|min_length[8]|max_length[16]');

        if($this->form_validation->run() == FALSE)
        {
            $this->load->view('templates/header');
            $this->load->view('templates/navigation');
            $this->load->view('pages/login');
            $this->load->view('templates/footer');
        }
        else
        {
            $data = [
                'username' => $this->input->post('username'), 
                'password' => $this->input->post('password')
            ];
            $result = $this->Account_model->login_account($data);
            
            $this->session->set_userdata('isloggedin', [
                'username' => $result['username'], 
                'email' => $result['email'], 
                'type' => $result['type']
            ]);

            $data['title'] = 'home';

            $this->load->view('templates/header');
            $this->load->view('templates/navigation');
            $this->load->view('pages/home');
            $this->load->view('templates/footer');
        }
    }
}

目前有些东西基本上没用,但我把它们放在那里以备将来使用。就像 $data['title'] 将使用它作为每个视图头部标题的占位符,因为我正在使用模板。

我做错了吗?为什么当我 print_r 来自 MY_Controller 的会话数据时它只返回“1”。

我一直在查看指南,但其中大多数都已过时,而且我可能使用的是过去版本中已弃用的内容,如果有请指出,我想练习干净利落的编码。

【问题讨论】:

    标签: php codeigniter session controller base


    【解决方案1】:

    您的方法不会那样工作,因为 userdata 返回一个数组,其中至少有一个名为 __ci_last_regenerate 的键(我不确定您使用哪个 CI 版本,但如果您自动加载会话库,您会总是在这里得到结果)

    设置一个额外的密钥 isLoggedin 就可以了。

    您的登录功能:

    public function login()
    {
        $this->form_validation->set_rules('username', 'Username', 'required|trim|min_length[8]|max_length[24]');
        $this->form_validation->set_rules('password', 'Password', 'required|trim|min_length[8]|max_length[16]');
        if($this->form_validation->run() == FALSE)
        {
            $this->load->view('templates/header');
            $this->load->view('templates/navigation');
            $this->load->view('pages/login');
            $this->load->view('templates/footer');}
        else
        {
            $data = array('username' => $this->input->post('username'), 'password' => $this->input->post('password'));
            $result = $this->Account_model->login_account($data);
    
            if ($result)
            {
                $session_data = array('username' => $result['username'], 'email' => $result['email'], 'type' => $result['type'], 'isLoggedin' => true);
                $this->session->set_userdata($session_data);
    
                $data['title'] = 'home';
                $this->load->view('templates/header');
                $this->load->view('templates/navigation');
                $this->load->view('pages/home');
                $this->load->view('templates/footer');
    
            }
    
        }
    }
    

    和你的控制器

    class MY_Controller extends CI_Controller {
        public function __construct()
        {
            parent::__construct();
        }
    
        public function is_logged_in()
        {
            return $this->session->userdata('isLoggedin');
        }  
    }
    

    通过这种方法,您可以得到一个正确的值或返回 true 或 false 的 NULL;

    有关更多信息,您可以查看此处 https://codeigniter.com/userguide3/libraries/sessions.html#CI_Session::userdata

    【讨论】:

    • 很抱歉回复太晚了。设置另一个键是什么意思?你的意思是在我的会话中设置另一个 array_key? as 'is_logged_in' to 1 or 0 or true or false?
    • 为了给你一个准确的答案,你必须向我展示你的模型;)
    【解决方案2】:

    如果您想打印所有会话数据,请使用此

    print_r($this->session->all_userdata());
    

    还有这部分

    public function is_logged_in()
    {
        $user = $this->session->userdata();
        return isset($user);
    }  
    

    将返回 1 或 0;

    【讨论】:

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