如何在Codeigniter中获取会话数据?

时间:2019-05-19 04:32:17

标签: codeigniter

我正在尝试使用codeigniter框架创建登录过程。表单验证有效,但会话中存在问题。我无法在“ Welcome-”之后获取用户名。

controller:Main.php

<?php 
    class Main extends CI_Controller
    {

        public function login()
        {
            $this->load->view('login');
        }



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

            if ($this->form_validation->run()) 
            {
                $username = $this->input->post('username');
                $password= $this->input->post('password');
                //model 
                $this->load->model('myModel');
                if ($this->myModel->can_login($username,$password))
                {
                    $session_data =  array('username' =>  $username);
                    $this->session->set_userdata('$session_data');
                    redirect(base_url().'main/enter');
                }
                else
                {
                    $this->session->set_flashdata('error','Invalid Username Or Password');
                    redirect(base_url().'main/login');
                }
            }
            else
            {
                $this->login();
            }

        }

        function enter()
        {
            if ($this->session->userdata('username')!=' ')
            {
                echo '<h2> Welcome- '.$this->session->userdata('username').'</h2>';
                echo '<a href="'.base_url().'main/logout">Logout</a>';
            }
            else
            {
                redirect(base_url().'main/login');
            }
        }

        function logout()
        {
            $this->session->unset_userdata('username');
            redirect(base_url().'main/login');
        }

    }
?>

2 个答案:

答案 0 :(得分:0)

在构造函数中添加会话库

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let contentOfCell = data[indexPath.row]
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? CustomCell else {
        return UITableViewCell()
    }
    cell.descriptionTextView.text = contentOfCell
    let textContainerPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: cell.CellImageView.frame.width, height: cell.CellImageView.frame.height))
    cell.descriptionTextView.textContainer.exclusionPaths = [textContainerPath]
    return cell
}

可以将会话库加载到autoload.php文件中的另一种方法

文件位置:application / config / autoload.php

 <?php 
        class Main extends CI_Controller
        {

        public function __construct()
            {
                parent::__construct();
                // Load form helper library
                $this->load->helper('form');

                // Load form validation library
                $this->load->library('form_validation');

                // Load session library
                $this->load->library('session');       

                $username = $this->session->userdata('username');

                if (empty($username)) {
                    redirect('main/logout');
                }
            }
    }

答案 1 :(得分:0)

我建议对enter()进行一些代码重新排列,以减少一点点的代码来更好地测试用户名。

    function enter()
    {
        if(empty($this->session->userdata('username')))
        {
            //base_url() accepts URI segments as a string. 
            redirect(base_url('main/login')); 
        }

        // The following code will never execute if `redirect()` is called
        // because `redirect()` does not return, it calls `exit` instead. 
        // So, you do not need an `else` block
        echo '<h2> Welcome- '.$this->session->userdata('username').'</h2>';
        echo '<a href="'.base_url().'main/logout">Logout</a>';
    }

empty()将是true,代表一个空字符串NULLFalse和其他一些东西。在这种情况下,您对空字符串或NULL最感兴趣。 ({empty()文档HERE。)

您可能要考虑在验证规则中添加'trim',因为它会从输入字符串中删除空白。这样可以避免有人尝试仅使用空格字符输入用户名的可能性。

否则,您的代码应该可以工作。如果没有,则很可能您没有正确配置CodeIgniter会话。堆栈溢出在此处回答了许多会话设置问题,可帮助您使其运行。