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
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
php和vue配合使用技巧和方法
May 09 PHP
php pdo连接数据库操作示例
Nov 18 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 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结合飞信 免费天气预报短信
2009/05/07 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP生成树的方法
2015/07/28 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
node.js入门教程
2014/06/01 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Python字符串替换实例分析
2015/05/11 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python datetime处理时间小结
2020/04/16 Python
为什么是 Python -m
2020/06/19 Python
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
数控专业应届生求职信
2013/11/27 职场文书
高中学生评语大全
2014/04/25 职场文书
我的理想演讲稿
2014/04/30 职场文书
大学生标准自荐书
2014/06/15 职场文书
化工专业自荐书
2014/06/16 职场文书
2014年市场部工作总结
2014/11/25 职场文书
死亡赔偿协议书
2015/01/28 职场文书
公历12个月名称的由来
2022/04/12 杂记