从db表反序列化php会话数据

时间:2015-01-07 06:27:31

标签: php session

我有一个自定义会话处理程序来处理db表中的会话。它工作得很好,问题是我无法将内容反序列化。

作为某人指针SOQ使用session_decode($data),但这似乎不起作用。

function getSession($data)
{       
    $backup = $_SESSION;        
    session_decode($data);
    $session=$_SESSION;
    $_SESSION = $backup ;
    return $session;
}

我正在尝试循环遍历会话表记录并逐个解码每个记录以从会话中提取一些信息。

我没有会话处理程序的任何自定义序列化,它默认为它。现在问题是如何从序列化会话字符串中获取额外数据?

php version 5.4+

修改   我没有自定义会话序列化处理程序,因为ini_get('session.serialize_handler')给了我php,默认情况下。

编辑:到目前为止,this似乎正常工作

<?php
class Session {
    public static function unserialize($session_data) {
        $method = ini_get("session.serialize_handler");
        switch ($method) {
            case "php":
                return self::unserialize_php($session_data);
                break;
            case "php_binary":
                return self::unserialize_phpbinary($session_data);
                break;
            default:
                throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
        }
    }

    private static 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;
    }

    private static function unserialize_phpbinary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
}
?>

用法:

<?php
Session::unserialize(session_encode());
?>

1 个答案:

答案 0 :(得分:0)

您说您正在使用自定义会话处理程序。它如何将数据写入数据库?为什么不尝试使用简单的序列化/反序列化函数?

http://php.net/manual/en/function.serialize.php