以下代码工作正常..
$somearray = getData();
$data = array(
'user_display_name' => $userdisplayname,
'username' => $usernamefromdb,
'logged_in' => TRUE,
);
$this->session->set_userdata($data); // used to create user session
这适用于codeigniter和sqlite ..
但是当我编码
时$data = array(
'user_display_name' => $userdisplayname,
'username' => $usernamefromdb,
'logged_in' => TRUE,
'arrdata' => $somearray
);
$this->session->set_userdata($data); // used to create user session
它说会话终止了......可能是什么问题?
当我var_dump($somearray)
时,它会显示信息。会话有内存限制吗?
谢谢
答案 0 :(得分:4)
我在其中一个应用程序中也注意到了同样的问题。调试问题让我发现CodeIgniter没有正确实现多维数组的序列化/反序列化。实际上有一个错误提交,我相信他们要么修复它,要么修复它。看一下他们在Core中的会话库。
function _serialize($data)
{
if (is_array($data))
{
foreach ($data as $key => $val)
{
if (is_string($val))
{
$data[$key] = str_replace('\\', '{{slash}}', $val);
}
}
}
else
{
if (is_string($data))
{
$data = str_replace('\\', '{{slash}}', $data);
}
}
return serialize($data);
}
请注意,它只会通过您的数组的1级,并且只能取代斜杠的唯一级别。问题是你有多维数组,那里可能有数据丢失序列化并擦除你的会话。我们通过扩展会话库并创建这些调用来修复它:
class MY_Session extends CI_Session {
public function __construct()
{
parent::__construct();
}
function _serialize($data)
{
$data = $this->_serialize_backslash_recursive($data);
return serialize($data);
}
function _unserialize($data)
{
$data = @unserialize(strip_slashes($data));
return $this->_unserialize_backslash_recursive($data);
}
function _serialize_backslash_recursive($data)
{
if (is_array($data))
{
return array_map(array($this,'_serialize_backslash_recursive'), $data);
}
else
{
if (is_string($data))
{
return str_replace('\\', '{{slash}}', $data);
}
}
return $data;
}
function _unserialize_backslash_recursive($data)
{
if (is_array($data))
{
return array_map(array($this,'_unserialize_backslash_recursive'), $data);
}
else
{
if (is_string($data))
{
return str_replace('{{slash}}', '\\', $data);
}
}
return $data;
}
}
现在可以正确地完成所有级别。试一试,看看它是否适合你。
答案 1 :(得分:1)
Codeigniter本身不会将所有会话数据存储在数据库中(与您认为的不同)。如Jose Adrian所指出的,它将数据存储在cookie中,限制为4KB。
要将所有会话数据存储在数据库中,请使用此替换会话类:http://codeigniter.com/wiki/OB_Session/
将会话数据存储在数据库中也比将其存储在cookie中更安全。