Проблемы с сериализацией массивов

Иногда бывает надо сохранить массив с данными куда-то, чтобы потом его достать и прочитать. Есть две хорошие функции для этого — serialize и unserialize. И все бы ничего, но вот иногда массив не получается десериализовать назад — возвращается предательское bool(false) вместо заветного массивчика.

Проблем может быть две — первая это включенная директива magic_quotes. Лечится примерно так —

(get_magic_quotes_gpc()) ? stripslashes(unserialize($variable)) : unserialize($variable);

За работу кода не отвечаю, но думаю мысль понятна.

Второй вариант, с которым втух я на несколько часов, это переносы строки. Если массив имеет в себе ячейку, в которой несколько строк, то он нифига не сериализуется взад, а выдаст false. Лечится убиванием \r\n

$str = preg_replace("/\n/", "", $str);
$str = preg_replace("/\r/", "", $str);
5.00 avg. rating (95% score) - 3 votes

7 комментариев

  • Убили \r\n перед сериализацией, сохранили,
    а если они понадобятся после  unserialize?
     
     

    • Только метить, потом заменять на переносы.

  • вместо удаления переносо строк можно попробовать base64_encode
    хотя я и часто использую serialize/unserialize но с описанной выше проблемой не стталкивался

  • Dmitry, я тоже согласен с тем что base64_encode будет тут к месту

  • $str = preg_replace("/[\n\r]/", "", $str);

    так экономим один вызов регекспа.

  • Да сейчас много движков поэтому это уже уходит на второй план ))

  • А об переменной s которая хранит в себе количество строк — забыли? Удаление переноса — уменьшение символов в строке, соответственно и в переменной s количество уменьшится.

css.php