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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
一个用于MySQL的PHP XML类
Oct 09 PHP
PHP 加密与解密的斗争
Apr 17 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
php简单实现MVC
Feb 05 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
php实现微信公众号无限群发
Oct 11 PHP
解析WordPress中的post_class与get_post_class函数
Jan 04 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
PHP Swoole异步读取、写入文件操作示例
Oct 24 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 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 带逗号千位符数字的处理方法
2012/01/10 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
node.js中的require使用详解
2014/12/15 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
对于Python中RawString的理解介绍
2016/07/07 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python实现超市商品销售管理系统
2019/10/25 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
文秘求职信范文
2014/04/10 职场文书
社会调查研究计划书
2014/05/01 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
锦旗赠语
2015/06/23 职场文书
家长会感言
2015/08/01 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技