首页 > 数据库 > mysql教程 > 如何修复由序列化 PHP 字符串中的字节计数长度不正确导致的'unserialize(): Error at offset”?

如何修复由序列化 PHP 字符串中的字节计数长度不正确导致的'unserialize(): Error at offset”?

Barbara Streisand
发布: 2024-12-22 19:10:14
原创
920 人浏览过

How to Fix

如何修复由于字节计数长度不正确而损坏的序列化字符串

错误“unserialize() [function.unserialize” ]: Error at offset" 在处理损坏的序列化字符串时经常出现。在这种情况下,问题源于不正确的字节计数长度。

理解问题

当 PHP 序列化数据时,它将每个序列化元素的长度存储为前缀。如果此长度不准确,PHP 无法正确反序列化字符串。

快速修复

要解决此问题,请使用以下命令重新计算序列化数组中每个元素的长度下列代码:

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
登录后复制

示例:

$data = 'a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15:"submit_comments";s:4:"open";s:5:"image";s:19:"C:\fakepath0.jpg;"}';

var_dump(unserialize($data)); // Error
var_dump(unserialize($recalculated_data)); // Correctly serialized
登录后复制

建议:

与其依赖快速修复,不如更新代码至关重要to:

  • 对字符串值使用单引号而不是双引号,以防止与路径分隔符冲突。
  • 在将序列化数据保存到数据库之前考虑使用base64编码,并在反序列化之前对其进行解码.
  • 包含一个函数,用于在反序列化之前验证序列化字符串的完整性(示例中提供)如下)。

验证函数:

function findSerializeError($data1)
{
    $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1);
    $max = max(strlen($data1), strlen($data2));

    for ($i = 0; $i < $max; $i++) {
        if (@$data1[$i] !== @$data2[$i]) {
            return "Error at offset $i";
        }
    }

    return true;
}
登录后复制

以上是如何修复由序列化 PHP 字符串中的字节计数长度不正确导致的'unserialize(): Error at offset”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板