试图在php中反序列化数组

时间:2011-04-15 00:58:03

标签: php arrays serialization cookies

if ($delete_one == null && $delete_two == null && $delete_three == null) {
    echo "THE CONTENT SHOULD BE GRABED ONCE";
    $arr = array("foo" => "bar", 12 => "one");
    echo $arr["foo"];
    echo $arr[12];
    $serialize_arr = serialize($arr);
    setcookie("test", $serialize_arr);

}
else
{
    echo " THIS PART WORKS! ";
    $arr_ser = $_COOKIE["test"];
    $arr = unserialize($arr_ser);
    var_dump(arr_ser);
    var_dump($arr);
    if ($arr == null) {
        echo "   Why is there nothing in here??   ";
    }
     else
    {
        echo "There is something in this array!";
    }   
}

当使用$ delete_one,使用两个或三个时,设置cookie,当用户提交表单时,其中一个元素会发生变化,从而完成else语句。 cookie被带回来,var_dump(arr_ser)将显示它显示序列化数组。然而,反序列化不起作用。这是错误的,我不确定为什么反序列化不起作用。

我已经尝试过Raisen所说的内容,并通过PHP手册查看并尝试模拟示例显示的内容。我创建了两个if语句,第二个是示例的副本,另一个稍微更改为将其他内容放入数组中。该示例有效,但我所做的更改没有。注意:我在WordPress的后端使用它来创建插件。

if ($delete_one == null && $delete_two == null && $delete_three == null) {
    $arr [foo] = "bar"; 
    $arr [boo] = "one";
    $serialize_arr = gzcompress(serialize($arr), 9);
    setcookie("test", $serialize_arr, time()+60*60*24*60, '/');

}
else
{
    if(isset($_COOKIE[test])) {
        $array = unserialize(gzuncompress($_COOKIE[test]));
        echo "<pre>";
        print_r($array);
        echo "</pre>";
    }
}   

if ($delete_one == null && $delete_two == null && $delete_three == null) {  
    $data[qwerty] = "blah";
    $data[1][a] = "1aa";
    $data[2][b] = "2bb";
    $data[3][c] = ";;;;;;";
    $data[name][first] = "Bob";
    $data[name][last] = "Jones";
    $data[val] = "This is a real long test string, to see how well the compression works!";

    $string = gzcompress(serialize($data), 9);
    setcookie("my_var", $string, time()+60*60*24*60, '/');
}
else
{
    if(isset($_COOKIE[my_var])) {
        $array = unserialize(gzuncompress($_COOKIE[my_var]));
        echo "<pre>";
        print_r($array);
        echo "</pre>";
    }
}   

内容未反序列化,因此gzuncompress存在数据错误。

1 个答案:

答案 0 :(得分:4)

您遇到的问题非常简单,并在评论中显示:

  

我已经确认gzcompress是   造成胡言乱语。该   后续代码var_dump($ arr_ser);现在回来了   串(54)   “一个:2:{S:3:\” 富\ “; S:3:\” 栏\ “; S:3:\” BOO \ “; S:3:\” 一\ “;}”

您已启用magic_quotes_runtime和/或magic_quotes_gps。 cookie的值已经通过AddSlashes()运行,因此不再是有效的序列化对象。简单的解决方法是禁用这些选项,或更改此行:

$arr_ser = $_COOKIE["test"];

到此:

$arr_ser = StripSlashes($_COOKIE["test"]);