Home >Backend Development >PHP Tutorial >Solution to unserialize returning false in php_PHP tutorial
PHP provides serialize (serialization) and unserialize (deserialization) methods.
After using serialize to serialize, use unserialize to deserialize to obtain the original data.
Let’s take a look at the following program example:
3 4
5
8
9
|
<🎜>$arr = array( <🎜> <🎜> 'name' => 'fdipzone', <🎜> <🎜> 'gender' => 'male' <🎜> <🎜>); <🎜> <🎜> <🎜> <🎜>$str = serialize($arr); //Serialization <🎜> <🎜>echo 'serialize str:'.$str."rnrn"; <🎜> <🎜> <🎜> <🎜>$content = unserialize($str); // Deserialization <🎜> <🎜>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" } |
1 2 3 4 | <🎜>$str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"Xinchen";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:"Beijing, China City Beijing Mobile";s:4:"miao";s:1:"5";}'; <🎜> <🎜>var_dump(unserialize($str)); // bool(false) <🎜> <🎜>?> |
Check the serialized string and find that the problem is in two places:
s:5:"url"
s:29:"http://www.baidu.com/test.html"
These two places should be
s:3:"url"
s:30:"http://www.baidu.com/test.html"
The reason for this problem is that the encoding when serializing the data is inconsistent with the encoding when deserializing. For example, the database is latin1 and UTF-8 character lengths are different.
In addition, there may be problems with single and double quotation marks and ascii characters"
r also has problems calculating length.
1
4
5
|
// 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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | echo ''; // 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:"Xinchen";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:"Beijing, China City Beijing Mobile";s:4:"miao";s:1:"5";}'; var_dump(unserialize($str)); // false var_dump(mb_unserialize($str)); // Correct |
Using the mb_unserialize method that handles single and double quotes and filters r can successfully deserialize.
Use unserialize:
bool(false)
Use mb_unserialize
4 11 12 |
array(9) { ["time"]=> int(1405306402) ["name"]=> string(6) "Xinchen" ["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) "Beijing, China Beijing Mobile" ["miao"]=> string(1) "5" } |