Сериализация данных сложных типов в виде строки

Задача
Необходимо строковое представление массива или объекта для занесения в файл или базу данных. Требуется обеспечить легкость обратного преобразования строки в массив или объект.

Решение
Для преобразования переменных и их значений в текстовую форму применяется функция serialize():

$pantry = array('sugar' => '2 lbs.','butter' => '3 sticks');
$fp = fopen('/tmp/pantry','w') or die ("Can't open pantry");
fputs($fp,serialize($pantry));
fclose($fp);

Для воссоздания переменных предназначена функция unserialize(): $new_pantry = unserialize(join('',file('/tmp/pantry')));

Обсуждение
Сформированная строка, преобразуемая обратно в массив $pantry, выглядит следующим образом:

a:2:{s:5:"sugar";s:6:"2 lbs.";s:6:"butter";s:8:"3 sticks";}

Здесь достаточно информации, позволяющей перевести все значения обратно в массив, но само имя переменной в последовательном представлении не сохраняется.

К данным, передаваемым в последовательной форме со страницы на страницу с помощью URL, необходимо применять функцию urlencode() для преобразования метасимволов URL в escape-последовательности:$shopping_cart = array('Poppy Seed Bagel' => 2,
'Plain Bagel' => 1,
'Lox' => 4);
print ' href="next.php?cart='.urlencode(serialize($shopping_cart)).'">Next';

На передаваемые в функцию unserialize() данные оказывают влияние параметры настройки magic_quotes_gpc и magic_quotes_runtime.


Если параметр magic_quotes_gpc равен on, то данные, передаваемые в URL, POST-переменные или cookies должны быть обработаны с помощью функции stripslashes() перед преобразованием в последовательную форму:
$new_cart = unserialize(stripslashes($cart));
// если параметр magic_quotes_gpc равен on
$new_cart = unserialize($cart); // если параметр magic_quotes_gpc равен off

Если параметр magic_quotes_runtime равен on, то данные в последовательной форме, сохраняемые в файле, необходимо обрабатывать при записи с помощью функции addslashes(), а при чтении – с помощью функции stripslashes():

$fp = fopen('/tmp/cart,'w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
// если параметр magic_quotes_runtime равен on
$new_cart = unserialize(stripslashes(join('',file('/tmp/cart'))));
// если параметр magic_quotes_runtime равен off
$new_cart = unserialize(join('',file('/tmp/cart')));

Данные в последовательной форме, прочитанные из базы данных, также должны быть переданы функции stripslashes(), если параметр magic_quotes_runtime равен on:
mysql_query(
"INSERT INTO cart (id,data) VALUES (1,'".addslashes(serialize($cart))."')");
$r = mysql_query('SELECT data FROM cart WHERE id = 1');
$ob = mysql_fetch_object($r);

// если параметр magic_quotes_runtime равен on
$new_cart = unserialize(stripslashes($ob->data));

// если параметр magic_quotes_runtime равен off
$new_cart = unserialize($ob->data);

Данные в последовательной форме, передаваемые в базу данных, также должны обрабатываться функцией addslashes() (или должен применяться другой, подходящий для базы данных метод escape-кодировки) для их корректного сохранения..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Обмен значениями без временных переменных
Операторы == и =: как избежать путаницы
Получение дампа содержимого переменных в виде строк
Совместное использование переменных процессами
Создание динамического имени переменной

Вернуться в раздел: PHP / 5. Переменные