php 提供serialize(序列化) 与unserialize(反序列化)方法。

使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。(改表结构或者进行下面操作)

  1. <?php
  2. $arr = array(
  3. 'name' => 'fdipzone',
  4. 'gender' => 'male'
  5. );
  6. $str = serialize($arr); //序列化
  7. echo 'serialize str:'.$str."\r\n\r\n";
  8. $content = unserialize($str); // 反序列化
  9. echo "unserialize str:\r\n";
  10. var_dump($content);
  11. ?>

输出:

  1. serialize str:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";}
  2. unserialize str:
  3. array(2) {
  4. ["name"]=>
  5. string(8) "fdipzone"
  6. ["gender"]=>
  7. string(4) "male"
  8. }

但下面这个例子反序列化会返回false

  1. <?php
  2. $str = 'a:9:
    {s:4:"time";i:1405306402;s:4:"name";s:6:"新
    晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com
    /test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"
    中国北京市 北京市移动";s:4:"miao";s:1:"5";}';
  3. var_dump(unserialize($str)); // bool(false)
  4. ?>

检查序列化后的字符串,发现出问题是在两处地方

s:5:"url"

s:29:"http://www.baidu.com/test.html"

这两处应为

s:3:"url"

s:30:"http://www.baidu.com/test.html"

出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。

另外有可能出问题的还有单双引号,ascii字符"\0"被解析为 '\0',\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。

\r在计算长度时也会出问题。

解决方法如下:

  1. // utf8
  2. function mb_unserialize($serial_str) {
  3. $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
  4. $serial_str= str_replace("\r", "", $serial_str);
  5. return unserialize($serial_str);
  6. }
  7. // ascii
  8. function asc_unserialize($serial_str) {
  9. $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );
  10. $serial_str= str_replace("\r", "", $serial_str);
  11. return unserialize($serial_str);
  12. }

例子:

  1. echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';
  2. // utf8
  3. function mb_unserialize($serial_str) {
  4. $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
  5. $serial_str= str_replace("\r", "", $serial_str);
  6. return unserialize($serial_str);
  7. }
  8. $str = 'a:9:
    {s:4:"time";i:1405306402;s:4:"name";s:6:"新
    晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com
    /test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"
    中国北京市 北京市移动";s:4:"miao";s:1:"5";}';
  9. var_dump(unserialize($str));    // false
  10. var_dump(mb_unserialize($str)); // 正确

使用处理过单双引号,过滤\r的mb_unserialize方法就能成功反序列化了。

    1. 使用unserialize
    2. bool(false)
    3. 使用mb_unserialize
    4. array(9) {
    5. ["time"]=>
    6. int(1405306402)
    7. ["name"]=>
    8. string(6) "新晨"
    9. ["url"]=>
    10. string(1) "-"
    11. ["word"]=>
    12. string(1) "-"
    13. ["rpage"]=>
    14. string(30) "http://www.baidu.com/test.html"
    15. ["cpage"]=>
    16. string(1) "-"
    17. ["ip"]=>
    18. string(15) "117.151.180.150"
    19. ["ip_city"]=>
    20. string(31) "中国北京市 北京市移动"
    21. ["miao"]=>
    22. string(1) "5"
    23. }

php unserialize 返回false的解决方法的更多相关文章

  1. php中unserialize 返回false的解决方法

    serialize 序列化 unserialize 反序列化 $content = 'a:5:{s:4:"img1";s:5:"35568";s:4:" ...

  2. djongo form.is_valid 返回false的解决方法

    在用djongo编写网站时,有时点击提交按钮之后,并未提交,通过debug会发现是form.is_valid()返回false造成的.但是,具体原因往往并不容易找. 这时在提交的html中添加如下代码 ...

  3. [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法

    -- :09关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 在实际编程工程中,常常遇到这样的情况:DataTable并不 ...

  4. ajax跨域POST时执行OPTIONS请求服务端返回403forbidden的解决方法

    ajax访问服务端restful api时,由于contentType类型的原因,浏览器会先发送OPTIONS请求. 本人服务端用的是spring mvc框架,web服务器用的是tomcat的,以下给 ...

  5. EasyDarwin返回401 Unauthorized解决方法

    在向EsayDarwin发起 RTSP DESCRIBE请求或者ANNOUNCE推送时,EasyDarwin会返回401 Unauthorized: 原因:在EasyDarwin的RTSP Sessi ...

  6. Type.GetType()在跨程序集反射时返回null的解决方法

    在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.Class ...

  7. php中curl返回false的解决办法

    本文介绍一下自己在使用curl中遇到的问题解决办法.希望可以帮助到大家. 原文地址:代码汇个人博客 http://www.codehui.net/info/37.html 首先来看一个封装的curl函 ...

  8. jquery ajax 不执行赋值,return没有返回值的解决方法

    大家先看一段简单的jquery ajax 返回值的js 复制代码 代码如下: function getReturnAjax{ $.ajax({ type:"POST", url:& ...

  9. onsubmit校验表单时利用ajax的return false无效解决方法

    代码: function checkNewEmail(){ var re_email=new RegExp("\\w+@\\w+\\.\\w+\\.?\\w*"); var new ...

随机推荐

  1. mysql概要(九)字符集和校对集

    1.mysql 字符集有细致设置: 2.mysql字符处理机制是:数据库和客户端之间存在一个字符集转换器(后文简称转换器)将客户端字符编码(必须告诉服务端的)转换成一种中间编码的数据(可自定义的但保证 ...

  2. maven概念

     1. 下载并解压Maven:Maven下载页2. 将环境变量M2_HOME设置为解压后的目录: 3. 将M2环境变量设置为M2_HOME/bin(在Windows上是%M2_HOME%/bin,在U ...

  3. 使用Maven构建Web项目

    现自己在重新操作一下:(使用的是Eclipse JavaEE版 ps:eclipse-jee-indigo-SR1-win32,已经安装好了m2eclipse插件) 1.新建Maven项目 1.1 F ...

  4. [转载] tcp那些事2

    原文: http://coolshell.cn/articles/11609.html 这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我 ...

  5. mongoDB 修改器()

    -----------------------------------2016-5-26 15:56:57-- source:[1],MongoDB更新操作符

  6. return

    return作为返回关键字,有以下两种意义的返回格式: 1,返回把握与函数成果:停止函数执行,返回调用函数,并且把函数的值作为返回成果. turn只能退出当前函数,如果多个函数嵌套就不行了,要想整个退 ...

  7. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

    在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...

  8. jackson反序列化时忽略不需要的字段(zhuan)

    http://www.cnblogs.com/davidwang456/p/5434071.html ********************************************* 有时候 ...

  9. djangoadmin导出csv

    from django.contrib import admin from .models import Order,OrderItem from django.http import HttpRes ...

  10. ubuntu14.04-rocketmq单机搭建

    需要环境: jdk(1.6+) git(如果clone源码,需要git,没有git直接下载gar包也行) maven3.x在安装之前确定自己已经安装了jdk:java -version 先获取reck ...