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. MVC服务器前台提示

    [HttpPost] public ActionResult AddMsg(MsgModel model) { string strSql = "insert into tbl_msg(ti ...

  2. 转:Jeff Atwood倾情推荐——程序员必读之书

    Jeff Atwood倾情推荐——程序员必读之书 英文版:<Code Complete 2>中文版:<代码大全(第二版)>作者:Steve McConnell译者:金戈  汤凌 ...

  3. 转:SQL的内连接与外连接

    参考:http://www.cuiyongjian.com/post-130.html 在oracle的SQL语句常用的连接有内连接(inner join),外连接(outer join)等,内连接又 ...

  4. mysql报关于用户密码1045(28000),几种处理方法 (zhuan)

    http://blog.itpub.net/29371470/viewspace-1409075/ http://blog.csdn.net/rosten/article/details/250658 ...

  5. Windows 内存架构

    理解 Virtual Memory, Physical Memory, Committed Memory, Page File, Working Set, Modified Pages, Standb ...

  6. phalcon:model 事件与事件管理器

    事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when p ...

  7. stream流批量读取并合并文件

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  8. selenium+python笔记10

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 我们多添加一些测试场景,比如:删除邮件,查找邮件,发送邮件等等 &qu ...

  9. 简单的Hibernate入门简介

    其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...

  10. JavaScript 3D图表

    在说3D图表以前,首先要明确两个概念,一个是数据的维度,一个是呈现数据载体的维度.对于数据的维度,一维的数据呈现,但是呈现的载体是二维的平面图,比如饼图: 已经能够很清晰地观察到数据的分布情况.数据如 ...