最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php中unserialize返回false的解決方法

 更新時(shí)間:2014年09月22日 12:02:49   投稿:shichen2014  
這篇文章主要介紹了php中unserialize返回false的解決方法,是PHP程序設(shè)計(jì)中非常經(jīng)典的問題,需要的朋友可以參考下

本文實(shí)例講述了php中unserialize返回false的解決方法,分享給大家供大家參考。具體方法如下:

php 提供serialize(序列化) 與unserialize(反序列化)方法。
使用serialize序列化后,再使用unserialize反序列化就可以獲取原來的數(shù)據(jù)。

先來看看如下程序?qū)嵗?/p>

<?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" 
} 

但下面這個(gè)例子反序列化會(huì)返回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:"中國北京市 北京市移動(dòng)";s:4:"miao";s:1:"5";}'; 
var_dump(unserialize($str)); // bool(false) 
?> 

檢查序列化后的字符串,發(fā)現(xiàn)出問題是在兩處地方:

s:5:"url"
s:29:"http://www.baidu.com/test.html"
這兩處應(yīng)為
s:3:"url"
s:30:"http://www.baidu.com/test.html"

出現(xiàn)這種問題的原因是序列化數(shù)據(jù)時(shí)的編碼與反序列化時(shí)的編碼不一致導(dǎo)致,例如數(shù)據(jù)庫是latin1和UTF-8字符長度不一樣。
另外有可能出問題的還有單雙引號(hào),ascii字符"\0"被解析為 '\0',\0在C中是字符串的結(jié)束符等于chr(0),錯(cuò)誤解析后算了2個(gè)字符。
\r在計(jì)算長度時(shí)也會(huì)出問題。

解決方法如下:

// 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:"中國北京市 北京市移動(dòng)";s:4:"miao";s:1:"5";}'; 
 
var_dump(unserialize($str));  // false 
 
var_dump(mb_unserialize($str)); // 正確 

使用處理過單雙引號(hào),過濾\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) "中國北京市 北京市移動(dòng)" 
 ["miao"]=> 
 string(1) "5" 
}

希望本文所述對(duì)大家PHP程序設(shè)計(jì)的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論

泽普县| 溆浦县| 肥城市| 阳曲县| 彭泽县| 视频| 青田县| 浦东新区| 太康县| 洛宁县| 沭阳县| 临安市| 大宁县| 隆子县| 隆尧县| 普兰县| 原平市| 马山县| 论坛| 大足县| 塔河县| 平舆县| 加查县| 东光县| 清新县| 布尔津县| 新宁县| 湛江市| 民和| 团风县| 班玛县| 张家口市| 子长县| 汉沽区| 阿克苏市| 广德县| 峨眉山市| 芒康县| 陇南市| 于田县| 开江县|