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版(5)
Oct 09 PHP
php URL编码解码函数代码
Mar 10 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
php去除HTML标签实例
Nov 06 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
Laravel框架集合用法实例浅析
May 14 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
php接口技术实例详解
2016/12/07 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue基础之事件v-onclick=&quot;函数&quot;用法示例
2019/03/11 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
Django开发中的日志输出的方法
2018/07/02 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
Django中的cookie和session
2019/08/27 Python
python验证码图片处理(二值化)
2019/11/01 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
Python单链表原理与实现方法详解
2020/02/22 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
新闻编辑自荐信
2013/11/03 职场文书
运动会入场解说词300字
2014/01/25 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js