php中序列化与反序列化详解


Posted in PHP onFebruary 13, 2017

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式

unserialize() 恢复原先变量

eg:

$stooges = array('Moe','Larry','Curly');
$new = serialize($stooges);
print_r($new);echo "<br />";
print_r(unserialize($new));

结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}

Array ( [0] => Moe [1] => Larry [2] => Curly )

当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:

$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'" rel="external nofollow" >next</a>';

margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。

如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:

$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启
$new_cart = unserialize($cart);

如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:

$fp = fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));
//如果magic_quotes_runtime关闭
$new_cat = unserialize(file_get_contents('/tmp/cart'));

在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。

mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')");
$rs = mysql_query('select data from cart where id=1');
$ob = mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart = unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart = unserialize($ob->data);

当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
PHP中的加密功能
Oct 09 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
YII框架模块化处理操作示例
Apr 26 PHP
PHP日期和时间函数的使用示例详解
Aug 06 PHP
PHP最常用的正则表达式
Feb 13 #PHP
PHP面相对象中的重载与重写
Feb 13 #PHP
PHP中overload与override的区别
Feb 13 #PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 #PHP
curl 出现错误的调试方法(必看)
Feb 13 #PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 #PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 #PHP
You might like
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
python中星号变量的几种特殊用法
2016/09/07 Python
Android分包MultiDex策略详解
2017/10/30 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
详解python 注释、变量、类型
2018/08/10 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
小学生元旦感言
2014/02/26 职场文书
政治表现评语
2014/05/04 职场文书
门面房租房协议书
2014/12/01 职场文书
2015年领班工作总结
2015/04/29 职场文书
2015大一新生军训感言
2015/08/01 职场文书
关于 Python json中load和loads区别
2021/11/07 Python