【问题标题】:How to store array in CodeIgniter sessions?如何在 CodeIgniter 会话中存储数组?
【发布时间】:2026-01-04 10:45:01
【问题描述】:

我正在使用方法setActiveId 调用控制器,并在会话中存储1 个数组并在使用var_dump($this->session->all_userdata()) 存储后显示它完美显示,但当我以其他方法打印会话时在同一个控制器中说checkinkingPermission 然后数组会话中为空。

现在我重复所有步骤,再增加一个步骤。

我确实在会话中存储了数组,就像在存储之前和之后一样,我在会话中存储了一个虚拟变量,

$this->session->set_userdata('dummy','tesing');

然后再次使用var_dump($this->session->all_userdata()) 打印,它显示所有带有数组和最后一个虚拟变量的会话,当签入checkinkingPermission 时,会话中的数组和虚拟变量完美显示(它解决了我的问题,但它的解决方案很粗糙)。

我想知道有什么遗漏或者在第一种情况下数组没有保存有什么问题(数组也不大于 4Kb(CI 会话限制))。

更新

来自名为connections_model的模型的方法

public function setActiveFriend($id) {
    $this->load->model('friend_model');
    $this->session->set_userdata('AF',$id);
    if($id==$this->session->userdata('userid'))
    {
        $this->session->set_userdata('MEOWN',1);
    }
    else
    {
        $this->session->set_userdata('MEOWN',0);
    }
    $this->friend_model->setFP($id); // Calls Here a method that is defined in another model
}

friend_model 中定义的另一种方法

public function setFriendPermissions($id) {

    $this->session->set_userdata('CFP',array());
    $this->db->where('user_id',$id);
    $locs = $this->db->get('friend_p')->result_array();

    if(is_array($locs))
    {
        foreach($locs as $loc)
        {
            array_push($this->session->userdata['CP'],$loc['perm_id']);
        }
    }
    $this->session->set_userdata('dummy','tesing'); // Important Line
}

在上述方法中,如果我想在同一方法中查看会话值,我会在会话数组中设置值,然后设置并查看它,但如果我在 connection_model 文件的任何方法中打印会话,则数组为空。

重要 如果我写了这一行 $this->session->set_userdata('dummy','tesing'); 然后会话数组保存并在所有方法中查看,如果我不写那行会话数组为空。

【问题讨论】:

  • 为了让问题更清楚,你是说当你在会话中存储一个字符串时,它在第二种方法中可用,但在存储数组时它不是?
  • 当我在会话中保存数组时,它会存储但不会在其他方法中显示,但是当我存储数组并在存储数组之后存储一些字符串时,数组会永久存储,否则你或我可以发布一些我使用的代码吗?
  • 你在哪里写负载$this->load->library('session');
  • 你检查过你的会话生命周期吗?
  • @Zarazthuztra 我用一些代码更新了我的问题

标签: php arrays codeigniter session


【解决方案1】:

您没有正确访问会话数据:

$this->session->userdata['CURRENTFPERMISSIONS']

这就是你所拥有的。请记住 $this->session->userdata 是一个函数,而不是一个数组,也就是说,试试这个

array_push($this->session->userdata('CURRENTFPERMISSIONS'),$locpermission['perm_id']);

请看documentation on session management

我不建议对数组使用所有大写键,因为该约定应该用于常量。

除了上述之外,尝试改变这个:

if(is_array($locpermissions))
{
        foreach($locpermissions as $locpermission)
        {
            array_push($this->session->userdata['CURRENTFPERMISSIONS'],$locpermission['perm_id']);
        }
}

到这里

if(is_array($locpermissions))
{
        $tmpArr = $this->session->userdata('CURRENTPERMISSIONS');
        foreach($locpermissions as $locpermission)
        {
            array_push($tmpArr,$locpermission['perm_id']);
        }
        $this->session->userdata('CURRENTPERMISSIONS',$tmpArr);
}

虽然,我越看你的代码,我越不明白你为什么要继续在会话结构中设置一个空白数组,如果它只被填充在一个条件中。可能需要重新考虑一下

【讨论】:

  • 听起来内部会话数据结构没有被更新,即使您将它作为参考传递的数组也是如此。奇怪,我得去检查那个的源代码。无论如何,答案已更新。
  • 谢谢 :) 是的,我也这样改,反正它对我有帮助并纠正我