当前位置: 首页 > 后端技术 > PHP

序列化serialize()和反序列化unserialize()的实例

时间:2023-03-30 00:45:32 PHP

在写序列化serialize和反序列化unserialize()的时候,先来看看:serialize——生成一个可存储的值表示描述字符串包含表示值的字节流的字符串,可以存储在任何地方。这有利于在PHP中存储或传递值而不丢失其类型和结构。要将序列化的字符串转回PHP值,请使用unserialize()。serialize()适用于除资源之外的任何类型。甚至可以对包含对自身的引用的数组进行serialize()。您正在序列化()的数组/对象中的引用也将被存储。当序列化一个对象时,PHP会在序列化前尝试调用该对象的成员函数__sleep()。这允许对象在序列化之前进行任何清理。同样,当使用unserialize()恢复对象时,将调用__wakeup()成员函数。个人实际项目中对serialize()的理解是可以将name、vaule、sex、money等多个字段的值存储在extend_params等数据库表中的一个字段中,无需打开这么多额外的领域。使用时需要先反序列化extend_params上的代码。下面的代码是我在窗帘电商项目(ECShop)的定价算法中使用的代码/***添加定制产品到购物车*/publicfunctionadd_customizationOp(){if(floatval($_POST['width'])<=0||floatval($_POST['height'])<=0||floatval($_POST['c_height'])<=0){echo'请选择正确的尺寸';出口;}$goods=Model()->table('goods,goods_common')->join('left')->on('goods.goods_commonid=goods_common.goods_commonid')->where(array('goods_common.goods_commonid'=>array('in',$_POST['goods'])))->select();if(empty($goods)){echo'请选择合适的款式面料';出口;}$class=$this->_get_class_list(1573);$gc_array=数组();foreach($classas$val){$gc_array[$val['gc_id']]=$val['gc_name'];}foreach($goodsas$key=>$val){如果($val['gc_id']==1574){$ratio=unserialize($val['ratio']);休息;}}if(empty($ratio)||empty($goods)){echo'请选择合适的款型面料';出口;}$extend_params['width']=floatval($_POST['width']);$extend_params['height']=floatval($_POST['height']);$extend_params['c_height']=floatval($_POST['c_height']);$extend_params['hl']=floatval($_POST['hl']);$extend_params['settle']='计价类型:特殊设定';如果(isset($_POST['pay_message'])&&!empty($_POST['pay_message'])){$extend_params['pay_message']=trim($_POST['pay_message']);}$insert_array=array();$extend_params['total_price']=0;$count=count($商品);$i=1;$总和=0;$item_id=时间()。兰特(1000,9999);foreach($goodsas$val){if($val['gc_id']==1574||(isset($ratio[$val['gc_id']])&&!empty($ratio[$val['gc_id']])&&intval($ratio[$val['gc_id']])>0)){if($val['goods_storage']-$_POST['数量']<0){echo$val['商品名称'].'库存不足';出口;}else{$param['goods_num']=$_POST['数量'];}if($val['gc_id']==1574){$param['goods_price']=$val['goods_price']*$extend_params['width'];}elseif($val['gc_id']==1589||$val['gc_id']==1590){$param['goods_price']=$val['goods_price']*floatval($ratio[$val['gc_id']])/100;}else{$extend_params['mianliao']=$gc_array[$val['gc_id']];$param['goods_price']=$val['goods_price']*$extend_params['width']*floatval($ratio[$val['gc_id']])/100;}如果($extend_params['height']-0.6>0){$param['goods_price']=$param['goods_price']*$extend_params['height']/0.45;}$sum+=$param['goods_price'];如果($i==$count){$extend_params['num']=$count;$extend_params['sum']=sprintf("%.2f",$sum);$param['goods_price']=sprintf("%.2f",$param['goods_price']);$param['buyer_id']=$this->member_info['member_id'];$param['store_id']=$this->member_info['bd_store_id'];$param['goods_id']=$val['goods_id'];$param['goods_name']=$val['goods_name'];$param['类型']=2;$param['customization_id']=$item_id;$param['goods_image']=$val['goods_image'];$param['store_name']=$val['store_name'];$param['extend_params']=serialize($extend_params);//重点$insert_array[]=$参数;取消设置($extend_params[‘面辽’]);$i++;}}//记录$da['f_id']=$count;$da['f_name']=json_encode($ratio);$da['f_ip']='11';$da['t_id']=$i;$da['t_name']='111';$da['t_msg']=json_encode($goods);$da['add_time']=时间();模型()->表('chat_log')->插入($da);$res=Model()->table('cart')->insertAll($insert_array);如果($res){回声1;出口;}else{echo'添加失败';出口;}}键$param['extend_params']=serialize($extend_params);//按键序列化效果a:5:{s:5:"width";s:1:"2";s:6:"height";s:1:"0";s:11:"pay_message";s:6:"study";s:11:"goods_price";s:5:"28.00";s:6:"settle";s:22:"Pricingtype:customized";}看这里知道效果的serialize()下面看看如何使用unserialize()/***购物车列表*/publicfunctioncart_listOp(){$model_cart=Model('cart');$condition=array('buyer_id'=>$this->member_info['member_id']);$cart_list=$model_cart->listCart('db',$condition);$总和=0;//商品总价$num=0;//商品数量$all_click=3;//是否全选if(isset($_GET['height'])){Tpl::output('height',intval($_GET['height']));}else{Tpl::output('height',0);}foreach($cart_listas$key=>$value){if(!empty($value['extend_params'])){$extend_params=unserialize($value['extend_params']);//重点$value['extend_params1']='';$value['extend_params2']='';如果(isset($extend_params['settle'])){$value['extend_params1'].=$extend_params['settle'];}if(isset($extend_params['width'])&&floatval($extend_params['width'])>0){$value['extend_params1'].="宽度:".floatval($extend_params['width'])。"米";}如果(isset($extend_params['height'])&&floatval($extend_params['height'])>0){$value['extend_params1'].="Height:".floatval($extend_params['height'])。“米”;}if(isset($extend_params['c_height'])&&floatval($extend_params['c_height'])>0){$value['extend_params1'].="窗口高度:".floatval($extend_params['c_height'])。“仪表”;}if(isset($extend_params['hl'])){if($extend_params['hl']==1){$value['extend_params2'].="Velcro:Front";}elseif($extend_params['hl']==2){$value['extend_params2'].="Velcro:Back";}elseif($extend_params['hl']==3){if(!isset($extend_params['mianliao'])){$value['extend_params2'].="没有魔术贴";}}//自定义商品$cart_list[$key]['n嗯']=$extend_params['num'];$cart_list[$key]['sum']=$extend_params['sum'];if(isset($extend_params['mianliao'])){$value['extend_params2'].="".$extend_params['面辽'];}}if(isset($extend_params['interfacing'])){if($extend_params['interfacing']==1){$value['extend_params2'].="递布:遮光递布";}elseif($extend_params['interfacing']==2){$value['extend_params2'].="递布:不遮光递布";}elseif($extend_params['interfacing']==0){$value['extend_params2'].="递布:无递布";$cart_list[$key]['cunbucloth']=$extend_params['cunbucloth'];$cart_list[$key]['cunbumon']=$extend_params['cunbumon'];$cart_list[$key]['pay_message']=$extend_params['pay_message'];$cart_list[$key]['分机end_params1']=$value['extend_params1'];$cart_list[$key]['extend_params2']=$value['extend_params2'];$cart_list[$key]['goods_sum']=ncPriceFormat($extend_params['sum']*$value['goods_num']);if($extend_params['sum']){$cart_list[$key]['goods_sum']=ncPriceFormat($extend_params['sum']*$value['goods_num']);}else{$cart_list[$key]['goods_sum']=ncPriceFormat($value['goods_price']*$value['goods_num']);$cart_list[$key]['goods_image_url']=cthumb($value['goods_image'],$value['store_id']);$cart_list[$key]['goods_price']=$value['goods_price'];$cart_list[$key]['quantity']=$value['goods_num'];//单笔订购单购的商品数量$cart[]=$cart_list[$key];如果($value['click']==1){$sum+=$cart_list[$key]['goods_sum'];$num+=$cart_list[$key]['goods_num'];}else{$all_click=2;}}//转储($cart);//退出(-1);Tpl::output('购物车',$购物车);Tpl::output('all_click',$all_click);Tpl::output('num',$num);Tpl::output('sum',ncPriceFormat($sum));Tpl::showpage('cart');}key$extend_params=unserialize($value['extend_params']);//重点下面可以直接使用$extend_params来定位你需要的数据。总结项目,不怕bug,敢于面对,敢于解决。在做这个项目的时候,我并不是很了解序列化和反序列化的真正用法。我是先连载的,后来想用的时候就没连载。我是直接去$value['extend_params']['sum']找的,原来是找不到数据。经过反复试错,我知道怎么反序列化了,然后就可以直接用$extend_params['sum']这样了,接触多了,了解也多了。不要害怕现在的自己,大部分不会,重要的是他们愿意去接触和了解。