2010-05-22 4 views
4

Я использую функции сериализации/unserialize в php 5.2. текст, который нужно сохранить, отправляется через форму. btw, без пробелов до или после. если текст содержит "или" она упорядочивает успешно. проблема не десериализируется назад. Что я делаю неправильно?unserialize problem in php

+0

Почему вы динь это? Почему бы не использовать сеансы или такие? - Отправка данных и получение их через POST означает, что пользователь может изменить его и должен передавать больше данных взад и вперед. – johannes

+0

все данные хранятся в файлах в сериализованном формате. СЕССИИ не сокращают его. – opteronn

+0

Хорошо, позвольте мне понять это. Вы получаете некоторые данные из формы POST, затем сериализуете массив $ _POST и записываете результирующую строку в файл? И затем вы читаете его обратно, данные не являются неэтериализованными. Правильно? –

ответ

1

Когда вы сериализацию, вы должны использовать addslashes и когда вы десериализируетесь, используйте stripslashes функцию .

. Пример:

if (get_magic_quotes_gpc()) 
{ 
    serialize($variable); 
} 
else 
{ 
    addslashes(serialize($variable)); 
} 

if (get_magic_quotes_gpc()) 
{ 
    stripslashes(unserialize($variable)); 
} 
else 
{ 
    unserialize($variable); 
} 
+0

оно вообще не сериализовалось. – opteronn

+0

@Web, который сказал вам это? –

+0

@Kurt: у вас могут быть магические цитаты включите его, см. мой обновленный ответ. Также, какую ошибку вы получаете, если есть? – 2010-05-22 14:51:28

4

это волшебные кавычки, вероятно, в ответ на такое поведение Итак, unseria Лизе вы, возможно, придется сделать stripslashes() первая:

if (get_magic_quotes_gpc()) $data = stripslashes($data); 

хотя это почти невозможно иметь magic_quotes на в системе 5.2 ...
Для того, чтобы сказать что-то определенное, вы должны найти разницу между начальной и возвращенные данные.

Но так или иначе, почему бы вам не использовать сеансы вместо отправки данных в браузер и обратно? Сессии действительно быстрее и безопаснее.

+0

Мне жаль, что я забыл сказать, что текст, который будет сериализован, ARRAY_ASSOCIATIVE. (возможно) из-за этой функции STRIPSLASHES не работает. – opteronn

+0

все данные хранятся в файлах в сериализованном формате. SESSIONS не обрезает его. – opteronn

+0

Извините @ Курт, но stripslashes НЕ HING делать с массивами. Он работает со строками. И это всегда работает. Во всяком случае, магические цитаты - это повод, и, чтобы сказать вам что-то определенное, вам нужно найти разницу между исходными и возвращенными данными. Или, по крайней мере, принесите обе строки здесь –

0

Добавление косой черты в цитаты решает проблему. Посмотрите на мой код: http://codepad.org/7JWa2BT6

+1

Неправильный комментарий. Я избежал переменных перед формированием массива, поэтому добавили сляки. Сериализованная строка должна быть экранирована. а не наоборот –

8

Дэвид Уолш имеет простое решение:

//to safely serialize 
$encoded_serialized_string = base64_encode(serialize($your_array)); 

//to unserialize 
$array_restored = unserialize(base64_decode($encoded_serialized_string)); 

http://davidwalsh.name/php-serialize-unserialize-issues

+0

Он работает! Но я хотел бы знать, будет ли он исправлен на более поздней версии PHP и каковы причины этой проблемы. –

+1

Это не ошибка с PHP. Как следует из более поздних ответов, вы должны использовать addlashes для обеспечения того, чтобы ваши кавычки были экранированы. Решение Дэвида Уолша работает, потому что оно преобразует все в строку base64, не содержащую кавычек. Я лично использовал этот метод, когда мне нужно было сохранять объекты stdClass в плоских файлах при разработке в системе без включения магических кавычек и развертывания на сервере, который это сделал. – Eclectic