【问题标题】:serialize / unserialize php object序列化/反序列化 php 对象
【发布时间】:2012-04-15 08:14:16
【问题描述】:

我无法理解 PHP 中序列化/反序列化的概念。

假设我有一个非常简单的 PHP 对象(类 someObject),并且在设置了该对象的属性后,我想序列化它:

所以我打电话给:serialize($someObject);

我想通过 html 表单将此序列化对象传输到另一个 php 脚本中,因此我将其设置为隐藏值:

<input type="hidden" name="someObject" value="<? print $someObject; ?>"

在下一个 php 脚本中,我想使用反序列化来取回我的对象​​并传输它,例如到数据库。

$unserialize = unserialize($_POST['someObject'])

但这总是返回 BOOL(false) - 那么我在这里缺少什么?

感谢您的帮助!

【问题讨论】:

  • 好吧 .. 制作一个 var_dump( $_POST['someObject'] ); 并查看 .. 另外,您应该为此使用会话,而不是隐藏输入字段。
  • 第二个脚本中 $_POST['someObject'] 包含什么?
  • 我不知道序列化字符串不会包含" 的任何保证,如果包含,生成的 HTML 将被破坏。如果 unserialize() 不能反序列化对象,会返回false
  • 当我 var_dump 得到 BOOL(false)

标签: php html forms serialization


【解决方案1】:

序列化的字符串如下所示:

O:1:"a":1:{s:3:"foo";s:3:"100";}

您必须urlencode/urldecode 序列化字符串以防止序列化表示中的任何字符破坏您的标记。看看你的页面源代码。第一个引号可能结束了您的 HTML value 属性。所以你得到了类似的东西:

<input ... value="O:1:"a":1:{s:3:"foo";s:3:"100";}">

所以你的$_POST 永远不会包含完整的序列化字符串,而只会包含O:1:

如果这不是问题,请确保您首先从对象中获得了序列化字符串。另请注意,某些对象在(未)序列化时无法序列化或行为已修改。请参考Notes in PHP Manual for serialize for details.

如果您不需要在运行 PHP 的不同服务器之间发送对象,请考虑将它们保存在 Session 中。由于对象在运输过程中不会被篡改,因此更容易、更不容易出错且更安全。

【讨论】:

  • @MrBr 好吧,是的。无论如何,这是更明智的解决方案。
【解决方案2】:

在 unserialize() 对象之前,您需要在第二个脚本中定义类

【讨论】:

  • hm 我不确定我是否理解正确,所以我使用 $object = new someObject(); 和后来的 $unserialized = unserialize($_POST['someObject']); $object = $unserialized 之类的东西?在我的情况下,这也返回 FALSE
  • 好吧,您似乎对定义类和实例化对象感到困惑...... $object = new someObject() 正在实例化一个对象......您必须已经定义了 someObject 类,然后才能做这个。然后反序列化序列化对象的行为将创建对象实例,因此您的 $unserialized = unserialize($_POST['someObject']);将这样做,在变量 $unserialized.... 中创建一个对象。 $object = $unserialized;将创建 $unserialized 对象的克隆。请尝试确定错误发生的确切位置
猜你喜欢
  • 2015-11-07
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2016-10-14
  • 2014-12-24
  • 2013-04-11
相关资源
最近更新 更多