快捷搜索:   nginx

php中序列化serialize与反序列化unserialize代码应用详解

serialize() 序列化函数,可以把变量和它们的值编码成文本形式,存放到某个字串或者数据库,SESSION等中

unserialize() 将被序列化的字串恢复原先变量。

比如有一串被序列化后的字串

a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;}

将他还原后

就是

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

的数组

案例:

<?php
$a = array('Moe','Larry','Curly');
$b = serialize($a);
print_r($b);echo "<br />";
print_r(unserialize($b));
?>

结果:

a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] => Moe [1] => Larry [2] => Curly )

这种方式的一个应用场景就是,可以把数组放到URL中传递,这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:

$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'" rel="external nofollow" >next</a>';


margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。

如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:

$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启

$new_cart = unserialize($cart);

如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:

$fp = fopen('/tmp/cart','w');

fputs($fp,addslashes(serialize($a)));

fclose($fp);

//如果magic_quotes_runtime开启

$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));

//如果magic_quotes_runtime关闭

$new_cat = unserialize(file_get_contents('/tmp/cart'));

在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。

mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')");

$rs = mysql_query('select data from cart where id=1');

$ob = mysql_fetch_object($rs);

//如果magic_quotes_runtime开启

$new_cart = unserialize(stripslashes($ob->data));

//如果magic_quotes_runtime关闭

$new_cart = unserialize($ob->data);

当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。


顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论