【问题标题】:unserialize problem in phpphp中的反序列化问题
【发布时间】:2010-05-22 14:22:03
【问题描述】:

我在 php 5.2 中使用序列化/反序列化函数。要存储的文本通过表单发布。顺便说一句,之前或之后没有空格。如果文本包含 " 或 ' 它成功序列化。问题是它没有反序列化。我做错了什么?

【问题讨论】:

  • 你为什么这么说?为什么不使用会话等? - 通过 POST 发送和接收数据意味着用户可以更改它并且必须来回传输更多数据。
  • 所有数据都以序列化格式存储在文件中。 SESSIONS 没有删减它。
  • 好吧,让我直说吧。您从 POST 表单接收一些数据,然后序列化 $_POST 数组并将结果字符串写入文件?然后你读回来,数据不会反序列化。对吗?
  • 如果数据包含"或',是的。
  • 你能 print_r($_POST) 显示实际收到的内容吗??

标签: php serialization


【解决方案1】:

大卫沃尔什有一个简单的解决方案:

//to safely serialize  
$encoded_serialized_string = base64_encode(serialize($your_array));  

//to unserialize  
$array_restored = unserialize(base64_decode($encoded_serialized_string));  

http://davidwalsh.name/php-serialize-unserialize-issues

【讨论】:

  • 有效!但是我想知道它是否会在以后的 PHP 版本中修复,以及这个问题的根源是什么。
  • 这不是 PHP 的错误。正如后面的答案所建议的那样,您应该使用 addlashes 来确保您的引号被转义。 David Walsh 的解决方案之所以有效,是因为它将所有内容都转换为不包含引号的 base64 字符串。当我在没有启用魔术引号的系统上开发并部署到启用的服务器时,我需要将 stdClass 对象持久保存到平面文件时,我个人使用了这种方法。
【解决方案2】:

这可能是对这种行为的回应。 因此,要反序列化,您可能必须先执行 stripslashes():

if (get_magic_quotes_gpc()) $data = stripslashes($data);

虽然在 5.2 系统上启用 magic_quotes 几乎是不可能的...
要说某件事,你必须找到初始数据和返回数据之间的差异。

但无论如何,您为什么不使用会话而不是将数据发送到浏览器并返回呢?会话确实更快更安全。

【讨论】:

  • 很抱歉,我忘了告诉要序列化的文本是 ARRAY_ASSOCIATIVE。 (可能)因为这个 STRIPSLASHES 函数不起作用。
  • 所有数据都以序列化格式存储在文件中。 SESSIONS 没有删减它。
  • 我很抱歉@Kurt,但 stripslashes 与数组无关。它适用于字符串。它总是有效的。无论如何,魔术引号只是一种猜测,要告诉你一些确定的事情,你必须找到初始数据和返回数据之间的差异。或者至少把两个字符串都带到这里
  • @Kurt 如果返回的数据相同,序列化工作。时期。你必须看得更好。
  • 很可能是因为魔术引号,如果您承认它已打开。至少你必须意识到没有人可以为你工作。尝试做一些明智的事情,而不仅仅是重复同样的“不工作”
【解决方案3】:

序列化时使用addslashes,反序列化时使用stripslashes函数。

示例:

if (get_magic_quotes_gpc())
{
  serialize($variable);
}
else
{
  addslashes(serialize($variable));
}

if (get_magic_quotes_gpc())
{
  stripslashes(unserialize($variable));
}
else
{
  unserialize($variable);
}

【讨论】:

  • @Kurt:您可能打开了魔术引号,请参阅我的更新答案。如果有的话,你会得到什么错误?
  • 看,@Web。你为什么不在发布之前运行你的代码? OP告诉你它根本没有序列化。确实如此。如果您没有足够的经验来动态编写代码 - 只需在发布之前运行它,看看它是否有作用。
【解决方案4】:

在引号中添加斜杠可以解决问题。看看我的代码: http://codepad.org/7JWa2BT6

【讨论】:

  • 评论错误。在形成数组之前,我已经转义了变量,因此添加了斜线。序列化的字符串应该被转义。不是相反
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2011-08-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多