Задача
Необходимо строковое представление массива или объекта для занесения в файл или базу данных. Требуется обеспечить легкость обратного преобразования строки в массив или объект.
Решение
Для преобразования переменных и их значений в текстовую форму применяется функция 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-кодировки) для их корректного сохранения.