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 相关文章推荐
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
初识laravel5
Mar 02 PHP
PHP7.0版本备注
Jul 23 PHP
PHP之预定义接口详解
Jul 29 PHP
用PHP的socket实现客户端到服务端的通信实例详解
Feb 04 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
完美的php分页类
Oct 24 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
php精度计算的问题解析
Jun 21 PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 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编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
JavaScript 指导方针
2007/04/05 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
Python map和reduce函数用法示例
2015/02/26 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
python将回车作为输入内容的实例
2018/06/23 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
python学习开发mock接口
2019/04/28 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
施工安全协议书
2013/12/11 职场文书
创业计划书如何吸引他人眼球
2014/01/10 职场文书
人事文员岗位职责
2014/02/16 职场文书
人代会标语
2014/06/30 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
校园广播稿精选
2014/10/01 职场文书
奖学金感谢信
2015/01/21 职场文书
红旗渠导游词
2015/02/09 职场文书
心灵点滴观后感
2015/06/02 职场文书
Nginx如何配置根据路径转发详解
2022/07/23 Servers