正在加载中...

ecshop2.7.3没有反序列化unserialize造成​报错Warning: Illegal string offset free_money admin/order.php

ecshop2.7.3没有反序列化unserialize造成​报错Warning: Illegal string offset free_money admin/order.php

serialize()函数和unserialize()函数,这两个函数的用法真是绝配,一个是进行序列化存储,另一个则是进行序列化恢复,也就是说,存储的时候,要存序列化的数据,serialize()之后,效果就像json_encode()之后的json格式数据,是用来存储在数据库中的;而当你要使用时,就需要反序列化unserialize(),变成数组,效果就像json_decode()。如果你要读取序列化完的字符串中的值,就必须先反序列化,如果没有反序列化就调用读取值,那么就会有报错,比如ecshop2.7.3 /admin/order.php中订单快递方式编辑时的报错:Warning: Illegal string offset 'free_money' in /ecshop/admin/order.php on line 2200 Warning:number_format() expects parameter 1 to be double, string given in /ecshop/include/lib_common.php on line 963

 

这个错误,表面看是lib_common.php的price_format ()里面的$price变量没有判断$price为空时调用number_format()函数出错,然而ecshop2.7.3上面已经加了相应的判断:if($price==='') { $price=0; }, 所以问题不在这儿。

仔细查看订单编辑配送方式对应的代码,$shipping_list[$key]['free_money'] = price_format($shipping['configure']['free_money'])的这个里面的$shipping['configure']是序列化的,但是ecshop里面并没有进行反序列化的处理,所以导致$shipping['configure']['free_money']的值是'a',这样在price_format ()里面并没有判断他不是数字,所以出错,现在的思路已经清晰了,只要更改将$shipping['configure']进行反序列化的处理,然后获得相应free_money的值,就可以解决问题了,详细的更改代码:
将:admin/order.php的2201行的$shipping_list[$key]['free_money'] = price_format($shipping['configure']['free_money'])这行代码先注释掉,然后加上一下代码:

    $shipping['configure'] = unserialize($shipping['configure']);
            $my_shipping = array();
            foreach($shipping['configure'] as $row){
                $my_shipping[$row['name']] = $row['value'];
            }
            $shipping_list[$key]['free_money'] = price_format($my_shipping['free_money']);



返回上一页