用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2787|回复: 6
收起左侧

[版本 3.x] session存储在数据库中的数据如何读取出来?

[复制链接]
发表于 2015-8-20 11:14:21 | 显示全部楼层 |阅读模式
我现在设置session存储在ci_sessions表中,然后通过session_id查询数据库,其中data字段存的是session内容,现在的问题是data字段存的是字符串,我应该如何才能把这个字符串转成数组来使用?
发表于 2015-8-20 11:43:00 | 显示全部楼层
你并不需要做任何操作, CI已经帮你做好了,不论是数组还是普通字符串,该序列化的已被序列化, 你只用CI的方法就好。
 楼主| 发表于 2015-8-20 11:44:37 | 显示全部楼层
yuzhigang5460 发表于 2015-8-20 11:43
你并不需要做任何操作, CI已经帮你做好了,不论是数组还是普通字符串,该序列化的已被序列化, 你只用CI的 ...

因为我需要读这个session表的程序已经不在ci框架里面了,所以不能使用ci类来读session值了,可以理解为跨域了
发表于 2015-8-20 11:48:32 | 显示全部楼层
取决于怎么序列化的, 尝试:
json_decode($your_string, true); //第二参数设为true则反序列化为数组, 反之为对象。
或者:
unserialize($your_string);
 楼主| 发表于 2015-8-20 11:54:36 | 显示全部楼层
本帖最后由 amu 于 2015-8-20 11:57 编辑
yuzhigang5460 发表于 2015-8-20 11:48
取决于怎么序列化的, 尝试:
json_decode($your_string, true); //第二参数设为true则反序列化为数组, 反 ...

原session数组
Array([__ci_last_regenerate] => 1440042706
[usr_name] => kiss
[usr_id] => 9527
[usr_sex] => 男
[info] => Array ([qq] => 123456 [mail] => 123456@qq.com )
[count] => 99
)

数据库存储的字符串
__ci_last_regenerate|i:1440042706;usr_name|s:4:"kiss";usr_id|s:4:"9527";usr_sex|s:3:"男";info|a:2:{s:2:"qq";s:6:"123456";s:4:"mail";s:13:"123456@qq.com";}count|i:99;

我不知道这是用什么方法转的



 楼主| 发表于 2015-8-20 12:12:05 | 显示全部楼层
哦,找到了,用的是 session_encode/session_decode,但这个session_decode会把结果直接丢给$_SESSION
 楼主| 发表于 2015-8-20 12:21:26 | 显示全部楼层
在php.net官方手册的评论中有人发了一段解码程序

PHP复制代码
 
function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
 
复制代码

本版积分规则