php中unserialize返回false的解决方法_php技巧

本文实例讲述了php中unserialize返回false的解决方法,分享给大家供大家参考。具体方法如下:

php 提供serialize(序列化) 与unserialize(反序列化)方法。
使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。

先来看看如下程序实例:

<?php
$arr = array(
  'name' => 'fdipzone',
  'gender' => 'male'
); 

$str = serialize($arr); //序列化
echo 'serialize str:'.$str."\r\n\r\n"; 

$content = unserialize($str); // 反序列化
echo "unserialize str:\r\n";
var_dump($content);
?> 

输出:

serialize str:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";} 

unserialize str:
array(2) {
 ["name"]=>
 string(8) "fdipzone"
 ["gender"]=>
 string(4) "male"
} 

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

<?php
$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";}';
var_dump(unserialize($str)); // bool(false)
?> 

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

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在计算长度时也会出问题。

解决方法如下:

// utf8
function mb_unserialize($serial_str) {
  $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
  $serial_str= str_replace("\r", "", $serial_str);
  return unserialize($serial_str);
} 

// ascii
function asc_unserialize($serial_str) {
  $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );
  $serial_str= str_replace("\r", "", $serial_str);
  return unserialize($serial_str);
} 

例子:

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'; 

// utf8
function mb_unserialize($serial_str) {
  $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
  $serial_str= str_replace("\r", "", $serial_str);
  return unserialize($serial_str);
} 

$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";}'; 

var_dump(unserialize($str));  // false 

var_dump(mb_unserialize($str)); // 正确 

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

使用unserialize:

bool(false) 
 
使用mb_unserialize

array(9) {
 ["time"]=>
 int(1405306402)
 ["name"]=>
 string(6) "新晨"
 ["url"]=>
 string(1) "-"
 ["word"]=>
 string(1) "-"
 ["rpage"]=>
 string(30) "http://www.baidu.com/test.html"
 ["cpage"]=>
 string(1) "-"
 ["ip"]=>
 string(15) "117.151.180.150"
 ["ip_city"]=>
 string(31) "中国北京市 北京市移动"
 ["miao"]=>
 string(1) "5"
}

希望本文所述对大家PHP程序设计的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, false
, 返回
, 解决方法
unserialize
unserialize返回false、unserialize false、curl exec 返回false、curl 返回false、php curl 返回false,以便于您获取更多的相关知识。

时间: 2024-09-16 11:39:01

php中unserialize返回false的解决方法_php技巧的相关文章

php中unserialize返回false的解决方法

 php 提供serialize(序列化) 与unserialize(反序列化)方法. 使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据. 先来看看如下程序实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php  $arr = array(    'name' => 'fdipzone',    'gender' => 'male'  );      $str = serialize($arr); //序列化  echo '

PHP处理Json字符串解码返回NULL的解决方法_php技巧

本文实例讲述了PHP处理Json字符串解码返回NULL的解决方法.分享给大家供大家参考之用.具体方法如下: 一般来说,php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array:若为false,返回object.如果返回NULL,说明报错,输出json_last_error(),得到的整数值对应错误提示.如下图所示: json_last_error()比较常见的是整数4, 是json字符串在json_decode之前已不完整,所以语法

PHP中source #N问题的解决方法_php技巧

最近写PHP里面的查询经常会遇到source #4或者source#5这样的问题,也就是通过mysql_query($sql1)进行一段查询的操作,返回的结果不是想要的字段而是source,去网上查了一些资料都说是什么'资源'的问题,虽然对于出现这种情况的原理还是不甚了解,但是解决方案是有了,下面是解决这个问题的代码: 复制代码 代码如下: <span style="font-family:Microsoft YaHei;font-size:14px;">$result2

关于验证码在IE中不刷新的快速解决方法_javascript技巧

今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码的切换地址后面加一个随机的参数 例如: <script> //换验证码 function changeimg(){ /* math.random范围是0-1 *999变成0-999 +3000 就是3000-3999 */ var time=Math.round(Math.random()*999

js中style.display=&quot;&quot;无效的解决方法_javascript技巧

本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多的操作,但如果我们style.display=""可能导致没有效果. 看下面一段代码: 复制代码 代码如下: <style>  #name  {      display:none;  } </style> </head> <body> &l

PHP中file_exists()判断中文文件名无效的解决方法_php技巧

本文实例讲述了PHP中file_exists()判断中文文件名无效的解决方法.分享给大家供大家参考.具体方法如下: php中判断文件是否存在我们会使用file_exists函数或is_file函数,但在使用file_exists时如果你文件名或路径是中文在uft8编码文档时是无效.本文就来解决此问题,下面我们一起来看看. 定义和用法:file_exists() 函数检查文件或目录是否存在. 如果指定的文件或目录存在则返回 true,否则返回 false. 例子1 复制代码 代码如下: <?php

php采用curl访问域名返回405 method not allowed提示的解决方法_php技巧

/** * http测试 * 注:PHP版本5.2以上才支持CURL_IPRESOLVE_V4 * @param $url 网站域名 * @param $type 网站访问协议 * @param $ipresolve 解析方式 */ public function web_http($url,$type,$ipresolve) { //设置Header头 $header[] = "Accept: application/json"; $header[] = "Accept-E

PHP中file_exists函数不支持中文名的解决方法_php技巧

一般来说PHP中常使用file_exists()判断某个文件或者文件夹是否存在,如果存在则返回true,否则返回false.但是该函数在网页使用UTF8编码的情况下,对于中文的文件名或者文件夹名不能返回正确值,始终返回false.经测试之后得出解决方法,分析造成这一情况的原因应该是编码不同而导致的PHP不能正确判断. 下面这段代码是不能够返回正确值的代码,无论文件是否在都返回不在: <?php; $file="/attachment/21/0/中文.rar"; $newfile

PHP整数取余返回负数的相关解决方法_php技巧

PHP语言虽然功能强大,但并不代表其没有缺点,在编写代码的过程中未免会遇到一些让人头痛的问题.下面我们将为大家介绍有关PHP整数取余返回负数的解决办法. 我们先来看个例子. 复制代码 代码如下: $res = 16244799483; echo $res%9999999; // 输出结果为 -5069794, 正确的结果应该是4801107 其实这也算上PHP一个BUG吧.最主要是PHP是个弱类型语言.他内置了机器来判断用户的类型. 但是机器毕竟是机器.也有判断出错的时候.就像上面.所以这时候我