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制作静态网站的模板框架(三)
Oct 09 PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
php实现微信支付之企业付款
May 30 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
js 浏览器事件介绍
2012/03/30 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
centos系统升级python 2.7.3
2014/07/03 Python
python通过索引遍历列表的方法
2015/05/04 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
浅析python 字典嵌套
2020/09/29 Python
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
最受欢迎的自我评价
2013/12/22 职场文书
关于旷工的检讨书
2014/02/02 职场文书
《木笛》教学反思
2014/03/01 职场文书
2015年考研复习计划
2015/01/19 职场文书