将post的数据使用addcslashes后存入数据库,读取的时候再用stripcslashes

解决方案 »

  1.   

    同样 如果post过来的内容中包含“\”反斜线,也会存在这种问题。
    总之,一旦post过来的内容中包含需要转义的字符,那么,序列化后的字符串存入数据库中后就跟存入前不同了,因此取出来之后也不能反序列化了。
      

  2.   

    TO: cnredarrow(红箭) 
    不行,试过了。
    addcslashes后无非是多家了一个“\”但序列化后,在存入数据库中就与存储前不一样了。(少一个“\”)因此不能发序列化了
      

  3.   

    次序问题<form method=post>
    <input type=text name=txt value="''">
    <input type=submit>
    </form>
    <?php
    if(get_magic_quotes_gpc())
      $_POST = array_map('stripcslashes',$_POST);echo $s = serialize($_POST);
    print_r(unserialize($s));
    ?>
      

  4.   

    to: xuzuning(唠叨) 
    直接在逻辑中 serialize 或 unserialize都没有问题的。即使不stripcslashes也可以正常进行序列化操作。
    但是蒋序列化后的字符串往数据库中一存,采取出来就不能unserialize了
      

  5.   

    检查你的magic_quotes_runtime 开关状态(可用get_magic_quotes_runtime()函数)
    如是打开的则取出后要用stripcslashes函数祛除转义再反序列化
      

  6.   

    xuzuning(唠叨)
    我的magic_quotes_runtime是关闭的。尝试过打开。但他会将数据库中双引号、单引号、反斜线都加上转义斜线,这样一来序列化后的字符串结构就被破坏了,更不能正确反序列化了。并且将magic_quotes_runtime打开后,smarty模板引擎工作不正常了。这是打开magic_quotes_runtime后得到的结果。
    O:14:\"itt003question\":4:{s:15:\"questionContent\";s:2:\"\\\'\";s:14:\"questionAnswer\";s:1:\"B\";s:12:\"questionItem\";a:4:{i:0;s:2:\"\\\'\";i:1;s:2:\"\\\'\";i:2;s:2:\"\\\'\";i:3;s:2:\"\\\'\";}s:12:\"AnswerNumber\";i:4;}
      

  7.   

    序列化后的对象是这样的。(请注意s:2:"\'";)s后面的这个数字代表的就是后面双引号中间的字符数。
    O:14:"itt003question":4:{s:15:"questionContent";s:2:"\'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"\'";i:1;s:2:"\'";i:2;s:2:"\'";i:3;s:2:"\'";}s:12:"AnswerNumber";i:4;}可是存入数据库后就变为
    O:14:"itt003question":4:{s:15:"questionContent";s:2:"'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"'";i:1;s:2:"'";i:2;s:2:"'";i:3;s:2:"'";}s:12:"AnswerNumber";i:4;}
    因为s后面的数字没变,但入库操作却将转义字符“\”给去掉了。因此再去出来之后就不能反序列化了。
      

  8.   

    真有你的,谁让你打开magic_quotes_runtime开关啦?!
    请测试如下代码。然后你就知道你的问题在哪了。(表test中有一text类型的txt字段)<form method=post>
    <input type=text name=txt value="''">
    <input type=submit>
    </form>
    <?php
    if($_SERVER['REQUEST_METHOD'] == "POST") {
      if(get_magic_quotes_gpc())
        $_POST = array_map('stripcslashes',$_POST);  $s = serialize($_POST);
      $s = mysql_escape_string($s);
      mysql_connect();
      mysql_select_db('test');
      mysql_query("insert into test (txt) values ('$s')");  $rs = mysql_query("select txt from test");
      list($t) = mysql_fetch_row($rs);
      print_r(unserialize($t));
    }
    ?>入库时你若不做转义处理当然就一塌糊涂了
      

  9.   

    谢谢!唠叨兄,我真够唠叨的了。
    将原始信息序列化后再整体作转义,而不是对单个input元素作转义。谢谢谢谢!!