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及Zend Engine的线程安全模型分析
Nov 10 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
php删除左端与右端空格的方法
Nov 29 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
分享php邮件管理器源码
Jan 06 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
PDO::getAttribute讲解
Jan 28 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php汉字转拼音的示例
2014/02/27 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
PHP7 弃用功能
2021/03/09 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python写入xml文件的方法
2015/05/08 Python
详解python中asyncio模块
2018/03/03 Python
python绘制雪景图
2019/12/16 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
专科毕业生求职简历的自我评价
2013/10/12 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
感谢信模板大全
2015/01/23 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
七一晚会主持词
2015/06/29 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫