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 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
windows下apache搭建php开发环境
Aug 27 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
Laravel 连接(Join)示例
Oct 16 PHP
PHP使用递归按层级查找数据的方法
Nov 10 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时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP错误机制知识汇总
2016/03/24 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
微信小程序日历效果
2018/12/29 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
2014年初中班主任工作总结
2014/11/08 职场文书
2015年招聘工作总结
2014/12/12 职场文书
考试作弊检讨书
2015/01/27 职场文书
2015年度党员个人总结
2015/02/14 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
vue实现滑动解锁功能
2022/03/03 Vue.js
Python中tqdm的使用和例子
2022/09/23 Python