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 'serialize str:'.$str."rnrn"; $content = unserialize($str); // 反序列化 echo "unserialize str:rn"; var_dump($content); ?>輸出:
1 2 3 4 5 6 7 8 9 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
1 2 3 4 <?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字符"