Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Для преобразования переменных и их значений в текстовую форму применяется функция 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 ' <a href="next.php?cart='.urlencode(serialize($shopping_cart)). '" >Next</a>';

На передаваемые в функцию 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-кодировки) для их корректного сохранения.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ