【问题标题】:Attempting to unserialize an array in php尝试在php中反序列化数组
【发布时间】:2011-08-05 23:54:01
【问题描述】:
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!";
    }   
}

cookie 是在 $delete_one 中没有的一个被使用时设置的,两个或三个被使用,并且当用户提交表单时,这些元素之一发生了变化,从而完成了 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 有数据错误。

【问题讨论】:

  • 你们两个var_dump(arr_ser); var_dump($arr);的输出是什么? (顺便说一句,你有一个丢失的$。)
  • 谢谢你的权利,我添加了字符串(38)“x�K�2��.�2�RJ��W����`,�X~^��u- \08� _" 对于 var_dump($arr_ser) 和 var_dump($arr) 是 bool(false)。但是在原始帖子中 var_dump($arr_ser);将显示序列化的数组,而 var_dump($arr) 将发布 bool(false)
  • 那么 cookie 显然包含乱码?
  • 好吧,我在想这些乱码来自 gzcompress。但我唯一的理由是,这是我改变的主要事情之一。如果您实际查看 cookie,它的内容为 x%DAK%B42%B2%AA.%B62%B6RJ%CB%CFW%B2%06%B3%92%12%8B%60%2C%B8X%7E %5E%AA%92u-%008%89%0D_ 注意 gzuncompress 也有数据错误。

标签: php arrays serialization cookies


【解决方案1】:

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

我已经确认 gzcompress 是 制造胡言乱语。这 var_dump($arr_ser);现在返回 字符串(54) "a:2:{s:3:\"foo\";s:3:\"bar\";s:3:\"boo\";s:3:\"one\";}"

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

$arr_ser = $_COOKIE["test"];

到这里:

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

【讨论】:

  • 一个小时想知道为什么反序列化返回 false 导致了这个,谢谢。我想在 cookie 过程中添加了一些东西。
猜你喜欢
  • 2023-02-23
  • 2011-08-11
  • 1970-01-01
  • 2014-05-21
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多