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




