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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
php生成随机数或者字符串的代码
Sep 05 PHP
php $_ENV为空的原因分析
Jun 01 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
php旋转图片90度的方法
Nov 07 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
docker-compose部署php项目实例详解
Jul 30 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
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
详解php的socket通信
2015/08/11 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
php实现每日签到功能
2018/11/29 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
跟老齐学Python之编写类之三子类
2014/10/11 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python虚拟环境项目实例
2017/11/20 Python
关于反爬虫的一些简单总结
2017/12/13 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python实现简单飞行棋
2020/02/06 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Django权限设置及验证方式
2020/05/13 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
Java如何格式化日期
2012/08/07 面试题
电大物流学生的自我评价
2013/10/25 职场文书
求职信格式范本
2013/11/15 职场文书
网吧消防安全制度
2014/01/28 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
委托书样本
2014/04/02 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
环保倡议书范文
2014/05/12 职场文书
标枪加油稿
2015/07/22 职场文书