【问题标题】:CodeIgniter Unset A Signle Session Item In An Multidimensional ArrayCodeIgniter 取消设置多维数组中的单个会话项
【发布时间】:2015-12-12 08:01:08
【问题描述】:

在我的登录功能中的 User.php 库中,我通过以下方式创建管理会话

$create_session = array(
    'is_logged' => true,
   'user_id' => $row->user_id
);

$this->CI->session->set_userdata('admin', $create_session);

问题是当我尝试单独取消设置管理会话数据时,它不会取消设置我选择的会话。

变量转储:

Array
(
    [__ci_last_regenerate] => 1449906266
    [admin] => Array
        (
            [is_logged] => 1
            [user_id] => 1
        )

)

库的注销功能:

未取消设置:首选方式

public function logout() {
    $user_data = $this->CI->session->userdata('admin');
    unset($user_data['is_logged']);
    unset($user_data['user_id']);
} 

但是当我在下面使用这种方式时,它可以工作

public function logout() {
    $this->CI->session->unset_userdata('admin');
}

由于某种原因,我不允许我从会话中的数组中单独取消设置会话数据。

问题如何单独取消设置我的管理会话数组中的 codeigniter 会话数据?

完整的 User.php 库

<?php

class User {

    private $user_id;
    private $username;

    public function __construct() {
        $this->CI =& get_instance();
        $this->CI->load->library('session');
    }

    public function login() {
        if ($this->validate_password() == true) {

            $this->CI->db->select('*');
            $this->CI->db->from($this->CI->db->dbprefix . 'user');
            $this->CI->db->where('username', $this->CI->input->post('username'));
            $query = $this->CI->db->get();

            if ($query->num_rows() > 0) {

                $row = $query->row();

                $create_session = array(
                    'is_logged' => true,
                    'user_id' => $row->user_id
                );

                $this->CI->session->set_userdata('admin', $create_session);

                $this->user_id = $row->user_id;
                $this->user_group_id = $row->user_group_id;
                $this->username = $row->username;

                return true;

            } else {

                return false;

            }

        }
    }

    public function is_logged() {
        $get_session = $this->CI->session->userdata('admin');
        return $get_session['is_logged'];
    }

    public function logout() {
        $user_data = $this->CI->session->userdata('admin');
        unset($user_data['is_logged']);
        unset($user_data['user_id']);

    }

    public function validate_password() {
        if (password_verify($this->CI->input->post('password'), $this->stored_hash())) {
            return true;
        } else {
            return false;
        }
    }

    public function stored_hash() {
        $this->CI->db->where('username', $this->CI->input->post('username'));
        $query = $this->CI->db->get($this->CI->db->dbprefix . 'user');
        if ($query->num_rows() > 0) {
            $row = $query->row();
            return $row->password;
        } else {
            return FALSE;
        }
    }
}

注意:

我有两个很多会话,一个管理员负责后端,一个目录负责前端,这就是数组中的原因。

【问题讨论】:

  • 在旁注中,您的 is_logged() 函数可能会导致通知错误,“注意:未定义索引:is_logged”。您可以使用return (array_key_exists('is_logged', $get_session) &amp;&amp; $get_session['is_logged'] === true); 来确保数组键存在,并根据其存在和值返回一个布尔值。

标签: codeigniter


【解决方案1】:

单独使用unset() 不会从 CodeIgniter 会话中删除值。您需要再次使用$this-&gt;CI-&gt;session-&gt;userdata('admin', $user_data) 将这些更改保存到会话中。

例如:

<?php
$user_data = $this->CI->session->userdata('admin');

print_r($user_data);
// Shows: Array ( [is_logged] => 1 [user_id] => 123 )

unset($user_data['is_logged']);
unset($user_data['user_id']);

print_r($user_data);
// Shows: Array ( )

// Check what values are saved in the session:
print_r($this->CI->session->userdata('admin'));
// Shows: Array ( [is_logged] => 1 [user_id] => 123 )

// Save your changes to the session 
$this->CI->session->set_userdata('admin', $user_data);

// Check what values are saved in the session (now that we've updated the session)
print_r($this->CI->session->userdata('admin'));
// Shows: Array ( )

因此,您需要执行以下步骤来更新存储在会话中的数组:

  1. 从会话中获取值:$arr = userdata('userdata')
  2. 从数组中删除值:unset($arr['key'])
  3. 保存对会话的更改:set_userdata('userdata', $arr)

作为一种解决方法,您可以直接编辑$_SESSION,绕过CodeIgniter 的Session library

unset($_SESSION['admin']['is_logged']);
unset($_SESSION['admin']['user_id']);

我不建议像这样绕过 Session 库,但它可能比我上面列出的步骤更适合您的目的。

【讨论】:

  • 感谢您的建议,我找到了取消设置数组中单个会话项的方法。我在下面添加了一个答案。
【解决方案2】:

感谢@Kirk Beard 的建议,我找到了使用 CodeIgniter 会话并取消单独设置我的管理数组()中的数据的方法;

我创建了管理多维数组会话

$create_session = array(
   'is_logged' => true,
   'other_item' => 'something'
);

$this->session->set_userdata('admin', $create_session);

如果你需要取消设置管理数组中的单个项目。

unset($this->session->userdata['admin']['is_logged']);

为我工作。

获取多维数组会话。

echo $this->session->userdata['admin']['is_logged'];

或者

$userdata = $this->session->userdata('admin');
echo $userdata['user_id'];

【讨论】:

    【解决方案3】:

    将会话生成为$this-&gt;CI-&gt;session-&gt;set_userdata($create_session); 而不是$this-&gt;CI-&gt;session-&gt;set_userdata('admin',$create_session);

    比如

    $create_session = array(
        'is_logged' => true,
        'user_id' => $row->user_id
    );
    
    $this->CI->session->set_userdata($create_session);
    

    现在甚至单独按名称取消设置

     $this->CI->session->unset_userdata('is_logged');
     $this->CI->session->unset_userdata('user_id');
    

    【讨论】:

    • 我有两个会话,一个管理员负责后端,一个目录负责前端,这就是数组中的原因。
    • 没问题。如果您需要一起销毁整个会话,则可以使用$this-&gt;CI-&gt;session-&gt;unset_userdata($create_session);
    • 我需要能够单独取消设置它们,因为我将添加更多不需要取消设置的会话数据。
    • 我已经在我的回答中找到了方法,感谢您的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2014-04-03
    • 2017-01-06
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多