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下删除字符串中HTML标签的函数
Aug 27 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
PHP 遍历文件实现代码
May 04 PHP
php标签云的实现代码
Oct 10 PHP
php url路由入门实例
Apr 23 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
php身份证号码检查类实例
Jun 18 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
smarty内置函数foreach用法实例
2015/01/22 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python类继承用法实例分析
2015/05/27 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
python使用folium库绘制地图点击框
2018/09/21 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
python开发前景如何
2020/06/11 Python
Python 串口通信的实现
2020/09/29 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
Ibatis的核心配置文件都有什么
2014/09/08 面试题
护理工作感言
2014/01/16 职场文书
函授药学自我鉴定
2014/02/07 职场文书
心理健康课教学反思
2014/02/13 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
慈善募捐倡议书
2015/04/27 职场文书
python实现高效的遗传算法
2021/04/07 Python
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang