You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP unserialize()函数报错:Error at offset 0 of 114 bytes 问题求助

解决PHP unserialize() 处理JSON字符串时的偏移错误问题

你遇到的这个错误核心原因非常明确——你尝试用PHP的unserialize()去解析一个JSON格式的字符串,而不是PHP原生序列化后的字符串,两者结构完全不兼容,所以触发了偏移错误。

先看你从数据库拿到的字符串:

{'_1615302093561_561':{'label':'Nul','minimum':'','maximum':'','contract':'', 'count':'1','period':'1','first':''}}

这是标准的JSON结构(只是用了单引号,严格JSON要求双引号,但多数解析器兼容),而PHP serialize()生成的字符串是类似这种格式:

a:1:{s:17:"_1615302093561_561";a:6:{s:5:"label";s:3:"Nul";s:8:"minimum";s:0:"";s:8:"maximum";s:0:"";s:8:"contract";s:0:"";s:5:"count";s:1:"1";s:6:"period";s:1:"1";s:5:"first";s:0:"";}}

unserialize()只能识别后者的结构,自然无法解析JSON字符串。

修复当前数据的可行方法

1. 改用json_decode()解析数据

既然数据是JSON格式,直接用json_decode()处理即可,注意先把单引号替换成双引号(符合严格JSON规范,避免解析失败):

// 先将单引号替换为双引号,确保JSON格式合法
$jsonString = str_replace("'", '"', $this->getConfigData('multi_payment_options'));
// 解析为关联数组(第二个参数true指定返回数组而非对象)
$paymentOptions = json_decode($jsonString, true);

执行后用var_dump($paymentOptions)就能看到正确解析后的数组了。如果返回null,可以用json_last_error_msg()查看具体解析错误,排查是否还有其他不符合JSON规范的字符。

2. 验证数据格式(可选)

如果不确定数据库里的字符串是JSON还是PHP序列化字符串,可以通过开头字符快速判断:

  • PHP序列化字符串通常以a:(数组)、s:(字符串)、i:(整数)等前缀开头;
  • JSON字符串通常以{[开头,键值对用引号包裹。

预防未来出现同类问题

既然数据库字段本应存储数组,要确保数据存入时的格式统一:

  • 如果是自己的代码存入数据,务必用serialize()处理数组后再存储:
    $paymentArray = [
        '_1615302093561_561' => [
            'label' => 'Nul',
            'minimum' => '',
            'maximum' => '',
            'contract' => '',
            'count' => '1',
            'period' => '1',
            'first' => ''
        ]
    ];
    // 序列化后存入数据库
    $serializedData = serialize($paymentArray);
    
  • 如果是第三方系统/前端把JSON存入了数据库,要么修改存入逻辑转成PHP序列化字符串,要么固定读取时用json_decode()解析,保持前后逻辑一致。

内容的提问来源于stack exchange,提问作者Claims

火山引擎 最新活动