php中unserialize返回false的解決方法
本文實(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" }
希望本文所述對大家PHP程序設(shè)計(jì)的學(xué)習(xí)有所幫助。
- golang、python、php、c++、c、java、Nodejs性能對比
- golang 調(diào)用 php7詳解及實(shí)例
- Golang加密解密之RSA(附帶php)
- PHP中SERIALIZE和JSON的序列化與反序列化操作區(qū)別分析
- PHP的serialize序列化數(shù)據(jù)以及JSON格式化數(shù)據(jù)分析
- 淺談php函數(shù)serialize()與unserialize()的使用方法
- 非常好用的兩個(gè)PHP函數(shù) serialize()和unserialize()
- 詳解php中serialize()和unserialize()函數(shù)
- 淺談php serialize()與unserialize()的用法
- golang實(shí)現(xiàn)php里的serialize()和unserialize()序列和反序列方法詳解
相關(guān)文章
php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能
這篇文章主要介紹了php基于雙向循環(huán)隊(duì)列實(shí)現(xiàn)歷史記錄的前進(jìn)后退等功能,較為詳細(xì)的分析了php使用歷史記錄功能所涉及的相關(guān)技巧與實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)工廠模式(factory)
這篇文章主要介紹了php設(shè)計(jì)模式中的工廠模式,使用php實(shí)現(xiàn)工廠模式,感興趣的小伙伴們可以參考一下2015-12-12PHP設(shè)計(jì)模式之策略模式原理與用法實(shí)例分析
這篇文章主要介紹了PHP設(shè)計(jì)模式之策略模式原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了策略模式的概念、原理及php實(shí)現(xiàn)與使用策略模式的相關(guān)操作技巧,需要的朋友可以參考下2019-04-04PHP fopen 讀取帶中文URL地址的一點(diǎn)見解
之前喜歡用fopen()函數(shù)跨域讀取圖片或其它文件,一直都沒發(fā)現(xiàn)什么問題。我所用的PHP版本都是5的了,應(yīng)該不會(huì)有CRLF Injection攻擊危險(xiǎn)吧2012-09-09json的鍵名為數(shù)字時(shí)的調(diào)用方式(示例代碼)
json的鍵名為數(shù)字時(shí)的調(diào)用方式(示例代碼)。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11