【问题标题】:php unserialize working differently across machinesphp反序列化在不同机器上的工作方式不同
【发布时间】:2011-12-15 08:27:20
【问题描述】:

我有一个经过php序列化的数组,结果是:

unserialize('a:2:{s:13:"custom_basket";a:1:{i:280583837398;a:4:{s:12:"product_name";s:0:"";s:8:"quantity";s:1:"1";s:5:"price";d:38.649999999999999;s:11:"description";a:7:{s:2:"id";s:12:"280583837398";s:3:"sku";s:0:"";s:4:"site";s:2:"UK";s:12:"condition_id";s:4:"1000";s:14:"transaction_id";s:12:"773563256018";s:8:"platform";s:4:"eBay";s:18:"order_line_item_id";s:25:"280583837398-773563256018";}}}s:6:"basket";a:0:{}}')

当我使用运行 php 5.3.5 的机器时,我得到:

注意:unserialize() [function.unserialize]:405 字节偏移量 46 处出错

当我旁边的家伙在他运行 5.3.6 的机器上运行它时,他将阵列取出来。我们运行 php 5.3.4 的服务器也成功地反序列化了数组。

我得到的错误指向第二个数组i:280583837398 中的第一个键,如果我也更改它s:12:"280583837398" 我的机器现在可以成功地反序列化数组。

有谁知道为什么会这样。不知道是不是php版本,我只是注意到我的两台成功机器的版本不同,所以值得一提。

如果有帮助,我会在 Snow Leopard 上运行 MAMP PRO。

【问题讨论】:

  • 不确定是否是版本,但不同的版本可能以不同的方式处理整数。您似乎理解 s 表示 x 长度的字符串,因此 s:12 是长度为 12 的字符串。但是如果 php 试图将其解析为 32 位 int,那么它可能会失败。另外,你的机器是 32 位还是 64 位的?
  • 嗨,马特,我的机器是 64 位的。它是英特尔酷睿 i5 Imac。
  • 我没有意识到我的机器可能会在这么大的整数上失败,只需将 int 编辑为 9 个字符即可使反序列化成功。这是一个常见问题吗?是否有解决方法?
  • 另外,我的机器如何首先序列化数组而不是反序列化,这两个进程中的整数处理方式是否不同?
  • 我真的不知道php是怎么处理的。您可以尝试升级并查看它是否有效,但这是一个奇怪的问题。我想您总是可以在序列化之前将 int 转换为字符串。

标签: php arrays serialization php-5.3


【解决方案1】:

不确定它是否是版本,但可能不同的版本处理 int 的方式不同。似乎您理解 s 表示长度为 x 的字符串,因此 s:12 是长度为 12 的字符串。但是如果 php 试图将其解析为 32 位 int,那么它可能会失败。

【讨论】:

  • 感谢您的帮助,我们最终在前面添加了“e”,以便序列化使其成为字符串
【解决方案2】:

280583837398 是一个相当大的数字,也许您的机器会尝试将其放入支持最多 32 位数字的 integer 中。

您可能需要long 来存储这个。

我现在只能从这件事上知道了。

【讨论】:

  • PHP 没有 longs,但它有 32 位和 64 位 ints,具体取决于架构。
猜你喜欢
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多