You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从MySQL获取序列化数据反序列化时遇offset 0错误求助

解决PHP反序列化时的"unserialize error at offset 0"问题

嘿,我一眼就看出问题出在哪了——你直接把Eloquent集合对象传给unserialize()函数了,这肯定会触发offset错误!

问题根源

你代码里用了DB::table()->get(),这个方法返回的是Eloquent集合对象,不是你需要的序列化字符串。当你把这个对象丢给unserialize()时,函数会把对象的字符串表示当成序列化数据来解析,自然在offset 0的位置就不符合序列化格式,直接报错。

而你提供的序列化字符串'a:2:{i:0;a:2:{i:0;i:1;i:1;s:2:"38";}i:1;a:2:{i:0;i:2;i:1;s:2:"39";}}'本身是完全有效的,所以问题全在数据获取的步骤上。

解决方案

根据你的需求,分两种情况处理:

情况1:只需要单条记录的variable1值

改用first()获取单条记录,然后取出字段值再反序列化:

public function retrival(){ 
    // 用first()获取匹配条件的第一条记录
    $warehouse_record = DB::table('initial')
        ->select('variable1')
        ->where('option','=',8)
        ->first();
    
    $decode_data = null;
    // 先检查记录是否存在,避免调用不存在的属性报错
    if($warehouse_record) {
        // 取出variable1字段的序列化字符串再反序列化
        $decode_data = unserialize($warehouse_record->variable1);
    }
    
    return $decode_data;
}

情况2:需要多条记录的variable1值

如果你的option=8对应多条记录,就遍历集合逐个处理:

public function retrival(){ 
    $warehouse_records = DB::table('initial')
        ->select('variable1')
        ->where('option','=',8)
        ->get();
    
    $decode_data = [];
    // 遍历每条记录,分别反序列化variable1字段
    foreach($warehouse_records as $record) {
        if(!empty($record->variable1)) {
            $decoded = unserialize($record->variable1);
            $decode_data[] = $decoded;
        }
    }
    
    return $decode_data;
}

额外排查建议

  • 可以先用dd($warehouse_data)输出一下获取到的数据,直观看到是集合还是单条记录,方便排查问题
  • 确认数据库中variable1字段的长度足够,避免序列化数据被截断(截断后的序列化字符串也会触发offset错误)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:24