Serialize - восстановить не верно сериализованный файл

Serg Klyk

Новичок
Здравствуйте! Когда то имел такую проблемку, serialize иногда сохраняет файл не верно, то ли через кавычки, то ли другую причину.

А когда то в нете, я нашел такой код, что он проходился по файлу и показывал неверные значения, типа контрольной суммы, только размера каждой переменной.

Вопрос: как найти такой код, помогите.

Я с того кода, тогда, брал пример (саму функцию рекурсии или как правильно), и делал так, что он сам восстанавливал такой файл. Хочу найти тот код, а то имеются опять такие проблемки.
 

AmdY

Пью пиво
Команда форума
у вас проблема надуманная. serialize работает со строками без проблем.
 

Serg Klyk

Новичок
Простите, но это не ответ. Если в сериализе попадают кавычки, где то в переменной массива, со временем функция unserialize не может такую строку перевести обратно в массив. Для этого берется парсер, которым просматривая файл, можно вычислить лишнюю кавычку или скобку.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Serg Klyk, пример данных можно? Чтобы на них завалился serialize/unserialize.
 

Serg Klyk

Новичок
Саму функцию я изучал хорошо, чтобы брать в оборот. Так что знаю о чем говорю.
Единая проблема с ней была, когда с кукисов приходили данные не в той кодировке, и когда восставленный файл копировался в режиме ANSI.
Данные не покажу, там много конф. данных.

Почему именно проблема в unserialize, так потому что скрипт сохранения при открытии файла смотрит за работой функци unserializeи, если она ничего не вернула, а файл не пуст, делается бекап. При serialize проверяется, верно ли записан файл (по размеру) и делается копия.
То есть, размеры совпадают, но файл не открывается.

Суть в том, что такое явление встречается часто из-за кавычек, по этому есть код который такой файл может восстановить.
Знаю о чем говорю, но вот код не могу найти.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Поток сознания. Зачем тогда, скажите мне, у вас там мешанина кодировок? Какую задачу вы решаете?
 

Serg Klyk

Новичок
Все данные пишутся в UTF-8 в массив. Массив сохраняется в файл как бинарный файл.
Здесь нет проблем в кодировке. То что я выше писал, то другое. Там фтп-менеджер когда файл копировал менял кодировку.
Разве, что интересно... может быть что все данные в UTF-8, а данные от пользователя через $_POST пришли, однажны, в другой кодировке?
 

AmdY

Пью пиво
Команда форума
Там фтп-менеджер когда файл копировал менял кодировку.
Разве, что интересно... может быть что все данные в UTF-8, а данные от пользователя через $_POST пришли, однажны, в другой кодировке?
вот, у тебя проблема в кодировках, а не serialize
 

WMix

герр M:)ller
Партнер клуба
Данные не покажу, там много конф. данных.
яб сказал что проблема в понимании, если не можешь локализовать проблему и написать короткий кусок кода который ее показывает
 

Serg Klyk

Новичок
Прикольно вот так по издиватся да? )
Для четкого понимания еще раз детальнее:
Проблема в функции есть, а именно когда размер переменной записывается не тот, что сама переменная. Часто этому мешает кавычка, да почитайте если не знали.

Почему так уверен, потому что раньше писал парсер который проходил сериализированную строку и исправлял. Часто проблема обнаруживалась в таком виде: ... s:9:"Компания "Название"";a: ... когда размер указан не всей переменной, а ее части до кавычки.
По этому более чем уверен, что ошибки делает именно serialize, и точно не кодировка, так как результат записи на лицо.

Свой парсер посеял, теперь опять ищу похожий код, сам цыкл прохода. По ходу придеться самому разбираться опять.
 

MiksIr

miksir@home:~$
Код:
php > echo serialize('Company "Company"');
s:17:"Company "Company"";

php > echo unserialize('s:17:"Company "Company"";');
Company "Company"
Как видишь, двойные кавычки не мешают. Сказки рассказывать - форумом ошиблись.
 

Serg Klyk

Новичок
Да, я и сам не верю. Но сталкиваюсь не раз с этим вопросом и вот решил окончательно решить его.

Забавно, что Вы не читали о том что функция эта не любит кавычек, иначе зачем такой код кому городить:

function stripslashes_rec(&$link){
if(!get_magic_quotes_gpc()&&!get_magic_qoutes_runtime())returntrue;
if(is_array($link)){
foreach($link as&$element)
stripslashes_rec($element);
}else $link = stripslashes($link);
returntrue;
}

Код экранирует кавычки перед сериализацией. Но мне не походит, трудоемко, достаточно парсер сериал строки только когда обнаружена ошибка.

Да и не спорю кстати, кавычки сериализе четко понимает, чего бы ей этого не знать, но иногда она их путает, результат показал выше.
Это не надуманный пример, ведь из жизни, когда переменная урезается до первой кавычки.
 

MiksIr

miksir@home:~$
Забавно, что Вы не читали о том что функция эта не любит кавычек, иначе зачем такой код кому городить:
Забавно скорее, что вы читали.
Приведенный код удаляет слеши, которые может добавить PHP сам для входящих данных (например, из кук) если включена "магия" http://php.net/manual/ru/security.magicquotes.php
 

Serg Klyk

Новичок
Забавно скорее, что вы читали.
Приведенный код удаляет слеши, которые может добавить PHP сам для входящих данных (например, из кук)
Про куки знаю, ну я для примера, просто сейчас нет времени точный код искать.
Одно скажу, хорошо, что Вам такая трабла не попадалсь. А вот когда данные слетают через функцию - не приятно.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мило, когда они находят для себя проблемы, потом ищу решение и таки решают поставленную задачу!

PS: Съезжаем нахрен отсюда.
 
Сверху