Массив PHP или объект или другая сложная структура данных не могут быть перемещены или сохранены или использованы иным образом вне запущенного скрипта PHP . Если вы хотите, чтобы сохраняли такую сложную структуру данных за пределами одного запуска скрипта, вам необходимо сериализовать . Это просто означает, что структура превращается в «более низкий общий знаменатель», который может обрабатываться другими вещами, кроме PHP, такими как базы данных, текстовые файлы, сокеты. Стандартная функция PHP serialize
- это просто формат , чтобы выразить такую вещь, она сериализует структуру данных в строковое представление, уникальное для PHP, и может быть изменено на PHP-объект с использованием unserialize
. Существует много других форматов, таких как JSON или XML.
Возьмем, к примеру, эту общую проблему:
PHP и Javascript могут общаться только через строки. Вы можете легко передать строку "foo"
в Javascript. Вы можете легко передать номер 1
в Javascript. Вы можете легко передавать логические значения true
и false
в Javascript. Но как передать этот массив в Javascript?
Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 )
Ответ - сериализация . В случае PHP / Javascript JSON на самом деле является лучшим форматом сериализации:
{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }
Javascript может легко изменить это на реальный массив Javascript.
Это так же верно, как представление одной и той же структуры данных:
a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}
Но в значительной степени только PHP использует его, поддержка этого формата в другом месте немного. Это очень распространено и хорошо поддерживается, но:
<array>
<element key='1'>elem 1</element>
<element key='2'>elem 2</element>
<element key='3'>elem 3</element>
</array>
Существует множество ситуаций, когда вам необходимо передать сложные структуры данных в виде строк. Сериализация, представляющая произвольные структуры данных как строки, решает, как это сделать.
Большинство носителей хранения могут хранить типы string . Они не могут напрямую хранить структуру данных PHP, такую как массив или объект, и они не должны, поскольку это будет связывать носитель данных с PHP.
Вместо этого serialize()
позволяет вам хранить один этих структур как строка.
Если вы знакомы с json_encode()
и json_decode()
(и JSON в целом), концепция аналогична.
В основном, когда вы сериализуете массивы или объекты, вы просто превращаете их в допустимый строковый формат, чтобы вы могли легко хранить их вне сценария php.
Примечание для объекта вы должны использовать методы магии __sleep и __wakeup. __sleep вызывается serialize (). Метод sleep вернет массив значений из объекта, который вы хотите сохранить.
__ wakeup вызывается unserialize (). Метод пробуждения должен принимать неэтериализованные значения и инициализировать их в них в объекте.
Для передачи данных между php и js вы должны использовать json_encode, чтобы превратить php-массив в действительный формат json. Или наоборот: используйте JSON.parese () для преобразования выходных данных (строки) в действительный объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)
Пожалуйста! пожалуйста! пожалуйста! НЕ сериализуйте данные и поместите их в свою базу данных. Сериализация может использоваться таким образом, но в этом отсутствует точка реляционной базы данных и типы данных, присущие вашему движку базы данных. Это делает данные в вашей базе данных не переносимыми, трудночитаемыми и может усложнять запросы. Если вы хотите, чтобы ваше приложение было переносимым на другие языки, например, скажем, вы обнаружите, что хотите использовать Java для некоторой части вашего приложения, что имеет смысл использовать Java, сериализация станет болью в ягодицах. Вы всегда должны иметь возможность запрашивать и изменять данные в базе данных без использования стороннего посреднического инструмента для манипуляции данными, которые необходимо вставить.
очень сложно поддерживать код, код с проблемами переносимости и данные, которые сложнее переносить на другие системы RDMS, новую схему и т. д. Это также имеет дополнительный недостаток: найдите свою базу данных на основе одного из полей, которые вы сериализовали.
Это не значит, что serialize () бесполезно. Это не так ... Хорошим местом для использования может быть файл кеша, который, например, содержит результат операции с интенсивным использованием данных. Есть много других ... Просто не злоупотребляйте сериализацией, потому что следующий парень, который приходит, будет иметь кошмар для поддержания или миграции.
Хороший пример searilize () и unsearilize () может быть следующим:
blockquote>$posts = base64_encode(serialize($_POST)); header("Location: $_SERVER[REQUEST_URI]?x=$posts");
Неисследовать на странице
if($_GET['x']) { // unpack searilized and ecoded URL $_POST = unserialize(base64_decode($_GET['x'])); }
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);
Запустить эту программу для эхо-выхода
a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}
здесь a = размер массива i = количество номеров массива s = размер значений массива
вы можете используйте сериализацию для хранения массива данных в базе данных и может извлекать и UN-serialize данные для использования.
Из http://php.net/manual/en/function.serialize.php :
Создает сохраняемое представление значения. Это полезно для хранения или передачи значений PHP без потери их типа и структуры.
blockquote>По сути, он принимает php-массив или объект и преобразует его в строку (которую вы затем можете передать или сохранить по своему усмотрению).
Используется Unserialize для преобразования строки обратно в объект.
Использование PHP serialize () unserialize ()
http://freeonlinetools24.com/serialize
echo '<pre>';
// say you have an array something like this
$multidimentional_array= array(
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 4, 7)
),
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 5, 7)
),
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 8, 7)
)
);
// serialize
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);
Что дает вам результат например
a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}
, если вы хотите вернуть исходный массив только с помощью функции PHP unserialize ()
$original_array=unserialize($serialized_array);
var_export($original_array);
Надеюсь, это поможет
Да, могу. Предположим, что нам нужно отслеживать ваши системные средства. В вашей системе имеется несколько администраторов и субадмин. Все они могут вставлять или обновлять или редактировать любую информацию. В конце вы должны знать, кто это делает. Для решения этой проблемы вам потребуется сериализовать.
**Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:
history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)
Надеюсь, это вам поможет.
Если вы хотите, чтобы ваше значение php сохранялось, вам нужно превратить его в строковое значение, то есть serialize () . И unserialize () делает обратную вещь.