取消初始化PHP会话数据


Unserialize PHP session data

我正在使用CodeIgniter3.x和数据库会话驱动程序,并且我想访问BLOB类型的data块。这里是我的blob数据:

__ci_last_regenerate|i:1435420891;identity|s:13:"john@doe.com ";username|s:13:"johndoe";email|s:13:"john@doe.com ";user_id|s:1:"5";old_last_login|s:10:"1435412865";

我试过unserialize($string),但没用!

unserialize():偏移量0 处出错

如何访问blob数据元素?例如:$user['email']

没有直接的方法。。。您可以使用session_decode(),但它要求您已经有一个活动会话,以便它可以将解码的数据放入$_SESSION中。

然而,我必须告诉你,如果你想那样做,那你就错了。您永远不应该访问其他用户的会话。如果有一些与会话相关的数据对拥有会话的用户来说并不明确,那么您只需在会话表中添加另一个字段并将其保存在其中。

我在这里得到了解决方案

所以我使用了会话解码http://php.net/session_decode

session_decode('__ci_last_regenerate|i:1446535049;ci_UserID|s:1:"2";ci_UserName|s:24:"example@xyz.com";logged_in|b:1;');

因此会话解码将所有加密数据存储在正常的php会话中。

我可以使用访问

echo $_SESSION['ci_UserID'];
正如Narf所说,没有简单的方法可以做到这一点。

ykay;的解决方案假定您正在使用当前内置的会话处理程序。应用程序可以随时更改这种格式,并且不能保证PHP会保持这种格式。

您的解决方案破坏当前会话,并用存储的数据替换它(但至少它将使用"当前"序列化方法)。

序列化函数和session_函数的读/写操作可以在运行时重写。只要你读回使用与解码相同机制编码的数据,你的机制就会起作用——但对于数据的长期存储或在无法保证PHP安装读取数据的一致性的情况下使用,这是一种糟糕的方法。

解决在用户会话之外读取会话数据问题的正确方法是使用serialize/unserialize格式:

ini_set("session.serialize_handler", 'php_serialize');

然后使用unserialize()读取数据。