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.0对象模型深度探索之对象复制
Mar 27 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
php ftp文件上传函数(基础版)
2010/06/03 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php的4种常用运行方式详解
2016/12/22 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
jQuery控制TR显示隐藏的几种方法
2014/06/18 Javascript
js脚本实现数据去重
2014/11/27 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
win与linux系统中python requests 安装
2016/12/04 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
什么是Web Service?
2012/07/25 面试题
线程同步的方法
2016/11/23 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
绿色学校实施方案
2014/03/31 职场文书
学历公证委托书
2014/04/09 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
工伤调解协议书
2016/03/21 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers