zoukankan      html  css  js  c++  java
  • PHP之序列化与反序列化讲解

    serialize() 把变量和它们的值编码成文本形式
    unserialize() 恢复原先变量
    eg:
    $stooges = array('Moe','Larry','Curly');
    $new = serialize($stooges);
    print_r($new);echo "<br />";
    print_r(unserialize($new));
    结果: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中在页面之间传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
    $shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
    echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">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()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。
  • 相关阅读:
    linux下通过vim编辑文件的方法
    无法访问VMWARE虚拟机中linux的nginx地址
    IDEA中通过Maven插件使用MyBatis Generator
    解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式
    MySQL 解决source 命令导入数据库 乱码
    MySQL SELECT表达式的执行顺序是从左往右依次执行
    MySQL 子查询(四)子查询的优化、将子查询重写为连接
    MySQL 子查询(三) 派生表、子查询错误
    MySQL 子查询(二)
    RocketMQ使用
  • 原文地址:https://www.cnblogs.com/milantgh/p/3764288.html
Copyright © 2011-2022 走看看