Попытка десериализации массива в php - PullRequest
2 голосов
/ 15 апреля 2011
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) отобразит его, показывая сериализованный массив. Однако несериализация не работает. Это неверно, и я не уверен, почему не работает десериализация.

Я попробовал то, что сказал Райзен, просмотрел руководство по PHP и попытался подражать тому, что показывают примеры. Я создал два оператора if, второй из которых является копией примера, а другой немного изменен, чтобы поместить другое содержимое в массив. Пример работает, но внесенные изменения - нет. ПРИМЕЧАНИЕ: я использую это в серверной части WordPress для создания плагина.

<code>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 "
"; } } 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] = "Джонс"; $ data [val] = "Это очень длинная тестовая строка, чтобы увидеть, насколько хорошо работает сжатие!"; $ string = gzcompress (serialize ($ data), 9); setcookie ("my_var", $ string, time () + 60 * 60 * 24 * 60, '/'); } еще { if (isset ($ _ COOKIE [my_var])) { $ array = unserialize (gzuncompress ($ _ COOKIE [my_var])); echo "
";
        print_r($array);
        echo "
"; } }

Контент не десериализуется, поэтому gzuncompress имеет ошибку данных.

1 Ответ

4 голосов
/ 30 апреля 2011

Проблема, с которой вы столкнулись, довольно проста и показана в вашем комментарии:

Я подтвердил, что gzcompress был создавая тарабарщину. var_dump ($ arr_ser); сейчас возвращается Строка (54) "А: 2: {s: 3: \" Foo \ "; s: 3: \" бар \ "; s: 3: \" б \ "; s: 3: \" один \ ";}"

у вас включены либо magic_quotes_runtime, и / или magic_quotes_gps. значение cookie было запущено через AddSlashes (), поэтому он больше не является допустимым сериализованным объектом. простое исправление - либо отключить эти параметры, либо изменить эту строку:

$arr_ser = $_COOKIE["test"];

к этому:

$arr_ser = StripSlashes($_COOKIE["test"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...