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(1)
Oct 09 PHP
discuz安全提问算法
Jun 06 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
php的socket编程详解
Nov 20 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
桌面中心(一)创建数据库
2006/10/09 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript比较文档位置
2008/04/08 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
javascript天然的迭代器
2010/10/29 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
详解vue 数据传递的方法
2018/04/19 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
python中的多重继承实例讲解
2014/09/28 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python类的继承和多态代码详解
2017/12/27 Python
Python用for循环实现九九乘法表
2018/05/31 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
护理专业学生职业生涯规划范文
2014/03/11 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL