amu 发表于 2015-8-20 11:14:21

session存储在数据库中的数据如何读取出来?

我现在设置session存储在ci_sessions表中,然后通过session_id查询数据库,其中data字段存的是session内容,现在的问题是data字段存的是字符串,我应该如何才能把这个字符串转成数组来使用?

yuzhigang5460 发表于 2015-8-20 11:43:00

你并不需要做任何操作, CI已经帮你做好了,不论是数组还是普通字符串,该序列化的已被序列化, 你只用CI的方法就好。

amu 发表于 2015-8-20 11:44:37

yuzhigang5460 发表于 2015-8-20 11:43
你并不需要做任何操作, CI已经帮你做好了,不论是数组还是普通字符串,该序列化的已被序列化, 你只用CI的 ...

因为我需要读这个session表的程序已经不在ci框架里面了,所以不能使用ci类来读session值了,可以理解为跨域了

yuzhigang5460 发表于 2015-8-20 11:48:32

取决于怎么序列化的, 尝试:
json_decode($your_string, true); //第二参数设为true则反序列化为数组, 反之为对象。
或者:
unserialize($your_string);

amu 发表于 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( => 1440042706
=> kiss
=> 9527
=> 男
=> Array ( => 123456 => 123456@qq.com )
=> 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;

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



amu 发表于 2015-8-20 12:12:05

哦,找到了,用的是 session_encode/session_decode,但这个session_decode会把结果直接丢给$_SESSION

amu 发表于 2015-8-20 12:21:26

在php.net官方手册的评论中有人发了一段解码程序


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;
    }
页: [1]
查看完整版本: session存储在数据库中的数据如何读取出来?