如何访问存储在数组代码点火器中的$ _ $ ESSION数据

时间:2018-05-20 07:48:09

标签: php codeigniter session

我一直关注tutorial on youtube about CodeIgniter。本教程仅依赖于$username $_SESSION变量,并未涉及$_SESSION的其他方面。根据{{​​3}},你可以简单地用密钥调用会话超全局。这是我的问题开始的地方。

VAR_DUMP($_SESSION)

$ _Session的var_dump提供以下信息(我已截断其他字段以使其更短)

 array (size=5)
      '__ci_last_regenerate' => int 1526800056
      '' => null
      'userID' => 
        array (size=1)
          0 => 
            array (size=14)
              'userID' => string '1' (length=1)
              'firstname' => string 'Tim' (length=3)
              'lastname' => string 'Coetzee' (length=7)
              'pword' => string 'xyz' (length=4)
              'email' => string 'someone@gmail.com' (length=17)

我想做什么

我只是希望能够像$_SESSION$_SESSION['email']那样调用$_SESSION['userID']超级全局。我想要访问会话变量的方式是完全正确的,因为您应该根据docs,因此我相信我的 问题出在我的控制器()或我设置会话数据()的方式可以在下面看到

问题

让我们说我想在视图中显示userID以上var_dump()信息,就像我执行以下测试一样...... echo $_SESSION['userID'];

以上导致错误

  

消息:类stdClass的对象无法转换为字符串

可以肯定的是,我应该调用哪个对象名称来说出firstname

我根据官方文档尝试了这个

echo $this->session->firstnameecho $this->user_data('userID');  这导致了同样的错误。

我意识到$ _SESSION数据似乎保存在一个多维数组中,所以我尝试了foreach()

foreach ($_SESSION as $sessions)
{
    foreach ($sessions as $value)
    {
        echo $value;
    }
}

给了我错误:

  

消息:为foreach()提供的参数无效

然而,在最后一次迭代之后又发生了两次类似的错误,它返回了所有会话的值,所以我猜测我在循环中做错了。

代码如下

Users_model.php

public function login($username, $password)
    {
        // Validate
        $this->db->where('username', $username);
        $this->db->where('pword', $password);
        $stmnt = $this->db->get('users');
        if($stmnt->num_rows() == 1){
            return $stmnt->row(1);
        } else {
            return false;
        }
    }

Controller.php这样

public function login(){
        $data['title'] = 'Sign In';
        $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('templates/header');
            $this->load->view('users/login', $data);
            $this->load->view('templates/footer');
        } else {
            // Get username
            echo $username = $this->input->post('username');
            // Get and encrypt the password
            echo $password = $this->input->post('password');
            // Login user
            $user_id = $this->users_model->login($username, $password);
            if($user_id){
                // Create session
                $user_data = array(
                    'username' => $username,
                    'userID' => $user_id,
                    'logged_in' => true
                );
              $username = user_data ['username'];
              $userID = user_data ['userID'];
              $logged_in = user_data ['logged_in']; 

                $this->session->set_userdata($username );
                $this->session->set_userdata($userID );
                $this->session->set_userdata($logged_in);
                // Set message
                //$this->session->set_flashdata('user_loggedin', 'You are now logged in');
                redirect('pages/index');
            } else {
                // Set message
               // $this->session->set_flashdata('login_failed', 'Login is invalid');
                redirect('users/failed');
            }
        }
    }

$ config.php中

$autoload['libraries'] = array('form_validation','session', 'pagination');

任何帮助建议,或赞赏的批评性批评

2 个答案:

答案 0 :(得分:6)

希望这会对您有所帮助:

如果您不想像这样更改模型查询集会话

$user = $this->users_model->login($username, $password);
if($user)
{
    $user_data = array(
                'username' => $username,
                'userID' => $user->id,
                'logged_in' => true
            );
    $this->session->set_userdata($user_data);

    //$this->session->set_flashdata('user_loggedin', 'You are now logged in');
    redirect('pages/index');
} 
else 
{
    // Set message
    // $this->session->set_flashdata('login_failed', 'Login is invalid');
    redirect('users/failed');
}

打印单个会话密钥,如下所示:

echo $this->session->userdata('username');
echo $this->session->userdata('userID');
echo $this->session->userdata('logged_in');

以及像这样的整个会话:

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

注意:对于 CI版本3.1.8 访问

$username = $this->session->username;
$userid = $this->session->userID;

了解更多https://www.codeigniter.com/user_guide/libraries/sessions.html#retrieving-session-data

答案 1 :(得分:1)

当你echo $_SESSION['userID'];试图像字符串一样显示整个数组时,它是不可能的。

另外你不能使用两个foreach循环,因为在外循环的第一个循环中有整数('__ci_last_regenerate' => int 1526800056)作为内循环的参数,所以你得到错误。

遵循会话数组结构,您可以调用以下字段: echo $_SESSION['userID'][0]['firstname'];

或更好:

$name = $this->session->userdata('firstname');