Denixxx
Мой дом здесь!
- Регистрация
- 7 Фев 2014
- Сообщения
- 244
- Реакции
- 216
- Автор темы
- #1
Привет всем.
Иногда перед любым разработчиком встает вопрос — как сохранить массив в поле MySQL.
Это нужно редко и часто такое решение не совсем правильно, но всё-таки иногда нужно.
Тут недавно в чатике предлагали такое решение — сериализовать и архивировать массив.
Получится строка, которую можно сохранить в поле MySQL.
Каюсь, сам недавно грешил таким.
В чатике предложено такое решение: $data = gzcompress(serialize($arr));
Где $data — строка для БД, $arr — массив для хранения
Но, во-первых, такая строка требует ещё обработки mysql_real_escape_string
Во-вторых, сжатая бинарная строка может содержать любые символы, в том числе и символы экранирования, кавычки и так далее, что делает нестабильным процесс распаковки.
В-третьих, такая система делает невозможным использовать в значениях исходных массивов некоторых символов, например \
Это может испортить контент.
Поэтому вместо mysql_real_escape_string лучше использовать безопасное кодирование в base64
Это увеличивает немного строку, зато делает безопасной и стабильной расшифровку и работает довольно быстро.
В общем, предлагаются 2 функции, которые могут надежно упаковать и распаковать массив в/из строки для последующего использования в БД.
Предлагаю всех знающих людей поучаствовать в обсуждении и/или предложить свои варианты.
Не сомневаюсь, что тема актуальная.
//PS Буду рад, если найдется более красивое, краткое и быстрое решение.
Иногда перед любым разработчиком встает вопрос — как сохранить массив в поле MySQL.
Это нужно редко и часто такое решение не совсем правильно, но всё-таки иногда нужно.
Тут недавно в чатике предлагали такое решение — сериализовать и архивировать массив.
Получится строка, которую можно сохранить в поле MySQL.
Каюсь, сам недавно грешил таким.
В чатике предложено такое решение: $data = gzcompress(serialize($arr));
Где $data — строка для БД, $arr — массив для хранения
Но, во-первых, такая строка требует ещё обработки mysql_real_escape_string
Во-вторых, сжатая бинарная строка может содержать любые символы, в том числе и символы экранирования, кавычки и так далее, что делает нестабильным процесс распаковки.
В-третьих, такая система делает невозможным использовать в значениях исходных массивов некоторых символов, например \
Это может испортить контент.
Поэтому вместо mysql_real_escape_string лучше использовать безопасное кодирование в base64
Это увеличивает немного строку, зато делает безопасной и стабильной расшифровку и работает довольно быстро.
В общем, предлагаются 2 функции, которые могут надежно упаковать и распаковать массив в/из строки для последующего использования в БД.
PHP:
function array_to_string_encode($arr) {
if (empty($arr) OR !is_array($arr)) return false;
$data = base64_encode(gzcompress(serialize($arr)));
return str_replace(array('+','/','='),array('-','_',''),$data);
}
function array_from_string_decode($string) {
if (empty($string)) return false;
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return unserialize(gzuncompress(base64_decode($data)));
}
Не сомневаюсь, что тема актуальная.
//PS Буду рад, если найдется более красивое, краткое и быстрое решение.
Последнее редактирование: