【问题标题】:How to unserialise the PHP SESSION serialised value?如何反序列化 PHP SESSION 序列化值?
【发布时间】:2013-07-23 06:47:58
【问题描述】:

我将一个 PHP SESSION 值存储到 DynamoDB 中,以下序列化结构是使用 session_set_save_handler() 从 on_session_write() 函数获取的,

id|s:26:"rj4n98n6371vpgj8h5s10lmoh2";matt|N;SmartyValidate|a:1:{s:7:"default";a:4:{s:16:"registered_funcs";a:2:{s:8:"criteria";a:0:{}s:9:"transform";a:0:{}}s:10:"validators";a:0:{}s:8:"is_error";b:0;s:7:"is_init";b:1;}}language_id|i:1;language|s:3:"eng";

我尝试了 PHP serialize() 和 unserialize() 函数,但它不起作用。那么,我怎样才能取消序列化这个值呢?

我需要按照 $_SESSION 打印值的输出格式。

【问题讨论】:

  • 你用来进行序列化的代码是什么...这看起来像是一个序列化调用,上面进行了某种字符串操作。
  • 由于某些原因,序列化数据已损坏。这可能是由于在此处发布时复制和粘贴错误或您的应用程序中的错误引起的。很难说不知道更多
  • 我正在使用session_set_save_handler("on_session_start", "on_session_end", "on_session_read", "on_session_write", "on_session_destroy", "on_session_gc"); 函数并创建了一个函数 on_session_write($key, $val) { echo $val;}

标签: php session


【解决方案1】:

文档中提到了session_set_save_handler

虽然数据看起来类似于serialize(),但请注意它是在session.serialize_handler ini 设置中指定的不同格式。

设置session.serialize_handler 默认为php,这意味着PHP 正在使用内部session_encode()session_decode() 函数。

session_decode() 解码$data 中提供的序列化会话数据,并用结果填充$_SESSION 超全局。

例子:

<?php
session_start();
$str = 'id|s:26:"rj4n98n6371vpgj8h5s10lmoh2";matt|N;SmartyValidate|a:1:{s:7:"default";a:4:{s:16:"registered_funcs";a:2:{s:8:"criteria";a:0:{}s:9:"transform";a:0:{}}s:10:"validators";a:0:{}s:8:"is_error";b:0;s:7:"is_init";b:1;}}language_id|i:1;language|s:3:"eng";';
if (session_decode($str)) {
  print_r($_SESSION);
} else {
  die ("failed to decode session");
}

注意:您需要使用session_start() 初始化一个虚拟会话。否则 session_decode() 会失败并且不会填充 $_SESSION 数组。

【讨论】:

  • 太棒了!感谢您的帮助!
【解决方案2】:
$data = unserialize($value);
print_r($data);

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2017-06-10
    • 2013-01-09
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多