4

我有一个扩展 PdoSessionStorage 的自定义类,但我不知道如何从会话中捕获属性以将它们保存为数据库中的独立字段。

其他可能性是在我的自定义 PdoSessionStorage 类的 sessionWrite($if, $data) 方法中反序列化会话数据。但我不知道如何反序列化 $data 字符串以仅获取我想要的数据。

我试过这个:

 unserialize($data);

这给我带来了以下错误:

致命错误:未捕获的异常 'ErrorException' 带有消息 'Notice: unserialize() [function.unserialize]: /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php line 220 中的偏移量 0 的 82 字节的错误在 /myserver /myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php:65 堆栈跟踪:#0 [内部函数]:Symfony\Component\HttpKernel\Debug\ErrorHandler->handle(8, 'unserialize( ) [...', '/Applications/M...', 220, Array) #1 /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php(220): unserialize('_symfony2|a:3: {...') #2 [内部函数]: app/myBundle/myCustomPdoSessionStorage->sessionWrite('72b823b39d316dd...', '_symfony2|a:3:{...') #3 {main} 抛出 / myserver/myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler。第 65 行的 php

任何人都可以帮助我吗?

4

2 回答 2

2

您在这里使用了错误的功能。unserialize适用于序列化值,但不适用于会话。即便是两人近在咫尺,也各有不同。

您可能正在寻找该session_decode功能。注意它反序列化为$_SESSION超全局,所以你可能想要包装它:

function unserialize_session($data) {
    $hasBuffer = isset($_SESSION);
    $hasBuffer && $buffer = $_SESSION;
    session_decode($data);
    $session = $_SESSION;
    $hasBuffer ? $_SESSION = $buffer : unset($_SESSION);
    return $session;
}

对应的是session_encode类似的工作方式。

另请参阅:如何在自定义处理程序中反序列化会话数据

于 2012-10-17T09:13:54.530 回答
1

我找到了!

My CustomPdoSessionStorageClass 扩展了NativeSessionStorage,它管理$_SESSION数组(读取、写入等)。

所以,在我的课堂上,我可以使用$this->read('userId')它并将其存储在我的数据库中。

所以非常感谢@hakre

于 2012-10-17T14:38:09.577 回答