【问题标题】:PHP: error: Notice: unserialize(): Error at offset 438 of 750 bytes inPHP: 错误: 注意: unserialize(): 在 750 字节的偏移量 438 处出错
【发布时间】:2018-01-14 13:18:44
【问题描述】:

我试图反序列化一个序列化的字符串:

$sri = 'a:8:{s:3:"key";s:32:"73b43c7df3604c8d725f856b219cffda";s:5:"email";s:19:"Aligh.Pro@gmail.com";s:4:"date";s:0:"";s:9:"user_info";a:4:{s:2:"id";i:2;s:5:"email";s:19:"Aligh.Pro@gmail.com";s:10:"first_name";s:5:"mahdi";s:8:"discount";s:4:"none";}s:9:"downloads";a:1:{i:0;a:3:{s:2:"id";i:44;s:8:"quantity";i:1;s:7:"options";a:2:{s:8:"quantity";i:1;s:8:"price_id";s:1:"1";}}}s:12:"cart_details";a:1:{i:0;a:10:{s:4:"name";s:17:"?????? ??";s:2:"id";i:44;s:11:"item_number";a:3:{s:2:"id";i:44;s:8:"quantity";i:1;s:7:"options";a:2:{s:8:"quantity";i:1;s:8:"price_id";s:1:"1";}}s:10:"item_price";d:20000;s:8:"quantity";i:1;s:8:"discount";d:0;s:8:"subtotal";d:20000;s:3:"tax";d:0;s:4:"fees";a:0:{}s:5:"price";d:20000;}}s:4:"fees";a:0:{}s:8:"currency";s:4:"RIAL";}';
$data_array = unserialize((string) $sri);
echo '<pre>';
print_r($data_array);
echo '</pre>';

但我看到了这个错误: 注意: unserialize(): 在偏移量 438 的 750 字节处出错 ...

我通过在线反序列化尝试了上面的序列化字符串。字符串工作得很好。 但在我的电脑里,它没有。

有什么问题?

【问题讨论】:

  • }}}s 应该有, 确定。
  • 字符串 s:17:"?????? ??" 不是 17 字节长。将其更改为 s:9:"?????? ??" 后,反序列化工作(对我而言)。我认为,这是复制/粘贴和错误编码的问题
  • @u_mulder 我做了,它偷不工作。
  • 因为这种情况有好几次出现?

标签: php serialization


【解决方案1】:

爸爸已经在this post 写了一个很好的答案。如果您需要快速修复,此代码将完成这项工作。

$data = preg_replace_callback(
    '!s:(\d+):"(.*?)";!', 
    function($m) { 
        return 's:'.strlen($m[2]).':"'.$m[2].'";'; 
    }, 
    $sri);

var_dump(unserialize($data));

【讨论】:

  • 工作得很好,但我仍然无法理解,如果数据是通过使用序列化函数存储的,为什么它不会反序列化?为什么我们需要这个函数?
  • 您需要了解,序列化本质上是一种将对象存储为字符串的方式。在表示中,您有一个部分告诉 php 即将到来的部分将是一定数量的字符长。这个数量在您的序列化字符串中有些错误。此代码只是重新计算所有部分的长度。我希望这会有所帮助。
【解决方案2】:

对答案的一点补充:正则表达式不适用于包含换行符的字符串。像

$sri = str_replace(["\n", "\r"], '', $sri);

应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2013-07-16
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多