从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
相关产品推荐
相关产品推荐

