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上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
深入理解php的MySQL连接类
Jun 07 PHP
Php header()函数语法及使用代码
Nov 04 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
常用PHP框架功能对照表
Oct 23 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
php里array_work用法实例分析
Jul 13 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 PHP
PHP7中I/O模型内核剖析详解
Apr 14 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创建无限级树型菜单
2015/11/05 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
如何卸载python插件
2020/07/08 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
中软国际Java程序员笔试题
2014/07/19 面试题
物业经理求职自我评价
2013/09/22 职场文书
文明礼仪事迹材料
2014/01/09 职场文书
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
计算机专业职业规划
2014/02/28 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
祝酒词范文
2015/08/12 职场文书
八年级英语教学反思
2016/02/15 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
Python绘制散乱的点构成的图的方法
2022/04/21 Python