session反序列化,mysql序列化字段反序列化_序列化serialize()與反序列化unserialize()的實例

 2023-11-19 阅读 20 评论 0

摘要:在寫序列化serialize與反序列化unserialize()時,我們先來看看:serialize — 產生一個可存儲的值的表示描述string serialize ( mixed $value )session反序列化、serialize() 返回字符串,此字符串包含了表示 value 的字節流,可以存儲于任何地方。這

在寫序列化serialize與反序列化unserialize()時,我們先來看看:

serialize — 產生一個可存儲的值的表示

描述

string serialize ( mixed $value )

session反序列化、serialize() 返回字符串,此字符串包含了表示 value 的字節流,可以存儲于任何地方。

這有利于存儲或傳遞 PHP 的值,同時不丟失其類型和結構。

想要將已序列化的字符串變回 PHP 的值,可使用 unserialize()。serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數組。你正 serialize() 的數組/對象中的引用也將被存儲。

當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數 __sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 __wakeup() 成員函數。

個人實際項目中的理解

java對象序列化和反序列化。序列化serialize()就是可以將多個字段的值如 name、vaule、sex、money等存儲在數據庫表中一個字段里如extend_params,而不用另外開辟那么多字段,使用的時候就要先反序列化extend_params

上代碼

下面的代碼是我在簾易購項目中計價算法中用到的(ECShop)

/**

* 添加定制商品到購物車

redis序列化和反序列化,*/

public function add_customizationOp() {

if (floatval($_POST['width']) <= 0 || floatval($_POST['height']) <= 0 || floatval($_POST['c_height']) <= 0) {

echo '請選擇正確的尺寸';

exit;

jsonserializer 反序列化 返回null?}

$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 '請選擇好合適的款式面料';

exit;

mysql表增加字段。}

$class = $this->_get_class_list(1573);

$gc_array = array();

foreach ($class as $val) {

$gc_array[$val['gc_id']] = $val['gc_name'];

mysql 修改字段類型,}

foreach ($goods as $key => $val) {

if ($val['gc_id'] == 1574) {

$ratio = unserialize($val['ratio']);

break;

mysql 命令 添加字段,}

}

if (empty($ratio) || empty($goods)) {

echo '請選擇好合適的款式面料';

exit;

mysql 修改字段、}

$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']);

mysql 刪除字段。$extend_params['settle'] = ' 計價類型:特別定制';

if (isset($_POST['pay_message']) && !empty($_POST['pay_message'])) {

$extend_params['pay_message'] = trim($_POST['pay_message']);

}

$insert_array = array();

mysql 加字段?$extend_params['total_price'] = 0;

$count = count($goods);

$i = 1;

$sum = 0;

$item_id = time() . rand(1000, 9999);

java反序列化可以繞過對象構造函數,foreach ($goods as $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['quantity'] < 0) {

echo $val['goods_name'] . '庫存不足';

exit;

} else {

$param['goods_num'] = $_POST['quantity'];

}

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;

}

if ($extend_params['height'] - 0.6 > 0) {

$param['goods_price'] = $param['goods_price'] * $extend_params['height'] / 0.45;

}

$sum += $param['goods_price'];

if ($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['type'] = 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[] = $param;

unset($extend_params['mianliao']);

$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']=time();

Model()->table('chat_log')->insert($da);

$res = Model()->table('cart')->insertAll($insert_array);

if ($res) {

echo 1;

exit;

} else {

echo '添加失敗';

exit;

}

}

```

***關鍵***

$param['extend_params'] = serialize($extend_params); //重點

***序列化效果***

![](https://images2018.cnblogs.com/blog/1472033/201809/1472033-20180910140511324-686175777.png)

a:5:{s:5:"width";s:1:"2";s:6:"height";s:1:"0";s:11:"pay_message";s:6:"書房";s:11:"goods_price";s:5:"28.00";s:6:"settle";s:22:" 計價類型:定制";}

***看到這里就知道serialize()作用性的了***

>那下面就來看看 是怎么用到unserialize()

/**

* 購物車列表

*/

public function cart_listOp() {

$model_cart = Model('cart');

$condition = array('buyer_id' => $this->member_info['member_id']);

$cart_list = $model_cart->listCart('db', $condition);

$sum = 0; //商品總價

$num = 0; //商品數量

$all_click = 3; //是否全選

if (isset($_GET['height'])) {

Tpl::output('height', intval($_GET['height']));

} else {

Tpl::output('height', 0);

}

foreach ($cart_list as $key => $value) {

if (!empty($value['extend_params'])) {

$extend_params = unserialize($value['extend_params']); //重點

$value['extend_params1'] = '';

$value['extend_params2'] = '';

if (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']) . "米";

}

if (isset($extend_params['height']) && floatval($extend_params['height']) > 0) {

$value['extend_params1'] .= " 高度:" . 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'] .= " 魔術貼:正面";

} else if ($extend_params['hl'] == 2) {

$value['extend_params2'] .= " 魔術貼:反面";

} else if ($extend_params['hl'] == 3) {

if (!isset($extend_params['mianliao'])) {

$value['extend_params2'] .= "無魔術貼";

}

}

//定制商品

$cart_list[$key]['num'] = $extend_params['num'];

$cart_list[$key]['sum'] = $extend_params['sum'];

if (isset($extend_params['mianliao'])) {

$value['extend_params2'] .= " " . $extend_params['mianliao'];

}

}

if (isset($extend_params['interfacing'])) {

if ($extend_params['interfacing'] == 1) {

$value['extend_params2'] .= " 襯布:遮光襯布";

} else if ($extend_params['interfacing'] == 2) {

$value['extend_params2'] .= " 襯布:不遮光襯布";

} else if ($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]['extend_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];

if ($value['click'] == 1) {

$sum += $cart_list[$key]['goods_sum'];

$num += $cart_list[$key]['goods_num'];

} else {

$all_click = 2;

}

}

// dump($cart);

// exit(-1);

Tpl::output('cart', $cart);

Tpl::output('all_click', $all_click);

Tpl::output('num', $num);

Tpl::output('sum', ncPriceFormat($sum));

Tpl::showpage('cart');

}

***重點***

$extend_params = unserialize($value['extend_params']); //重點

下面你就可以直接用$extend_params 來定位到你需要的數據了

>總結

*做項目不要怕Bug,要敢于面對它并把它真正的解決,當我做這個項目的時候,我并不是很清楚地知道序列化和反序列化的真正用法,我是先序列化了,然后要用的時候沒有序列化,而直接去 $value['extend_params']['sum']這樣去找,所以它是找不到數據的,后來經過反復試錯,我懂得了得反序列化它,然后就可以直接這樣用$extend_params['sum'],故接觸得多,懂得也就多啦,不用怕自己現在很多都不會,重要的是自己肯去接觸肯去理解*

***注:文章來源雨中笑記錄實習期遇到的問題與心得,轉載請申明原文***

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/182300.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息