Comment utiliser php serialize () et unserialize ()

125

Mon problème est très basique.

Je n'ai trouvé aucun exemple pour répondre à mes besoins quant à ce que signifie exactement serialize()et unserialize()en php? Ils donnent juste un exemple - sérialiser un tableau et afficher une sortie dans un format inexpliqué. Il est vraiment difficile de comprendre le concept de base à travers leur jargon.

ÉDITER:

<?php

$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);

?>

production:

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Je ne comprends pas la deuxième sortie. En plus de cela, quelqu'un peut-il donner un exemple de situation dans laquelle j'ai besoin de sérialiser un tableau php avant de l'utiliser?

Istiaque Ahmed
la source
10
Au cas où vous seriez toujours curieux de connaître la "sortie secondaire", c'est assez simple: a = tableau, 3 = de taille trois éléments dans les {}. à l'intérieur, vous avez i = entier / index égal à 1, chaîne de len 6 égal à "elem 1", entier égal à 2 .. etc. etc. C'est assez clair quand vous le lisez comme ça. Vous pouvez imaginer plusieurs niveaux de tableaux / objets facilement contenus à l'intérieur, mais la modification est très imprudente, vous devriez vraiment désérialiser, modifier puis sérialiser pour assurer la cohérence.
Grizly
2
@IstiaqueAhmed, Concernant "quelqu'un peut-il donner un exemple de situation dans laquelle j'ai besoin de sérialiser un tableau php avant de l'utiliser" , il y a un tel exemple à stackoverflow.com/a/30436890/632951
Pacerier
@grizly merci mec, je cherchais une réponse comme ça depuis deux ans, je ne savais pas comment l'expliquer ni comment associer la raison de l'utilisation de cette fonctionnalité, merci pour la réponse
isaacewing

Réponses:

169

Un tableau ou un objet PHP ou une autre structure de données complexe peut pas être transporté, stocké ou utilisé d'une autre manière en dehors d'un script PHP en cours d'exécution . Si vous souhaitez conserver une structure de données aussi complexe au-delà d'une seule exécution d'un script, vous devez sérialiser . Cela signifie simplement mettre la structure dans un "plus petit dénominateur commun" qui peut être géré par des choses autres que PHP, comme les bases de données, les fichiers texte, les sockets. La fonction PHP standard serializeest juste un format pour exprimer une telle chose, elle sérialise une structure de données en une représentation sous forme de chaîne qui est unique à PHP et peut être inversée en un objet PHP en utilisant unserialize. Il existe cependant de nombreux autres formats, comme JSON ou XML.


Prenons par exemple ce problème courant:

Comment passer un tableau PHP à Javascript?

PHP et Javascript ne peuvent communiquer que via des chaînes. Vous pouvez passer la chaîne "foo"très facilement à Javascript. Vous pouvez passer le numéro 1très facilement à Javascript. Vous pouvez passer les valeurs booléennes trueet falsefacilement à Javascript. Mais comment passer ce tableau à Javascript?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

La réponse est la sérialisation . Dans le cas de PHP / Javascript, JSON est en fait le meilleur format de sérialisation:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript peut facilement inverser cela dans un tableau Javascript réel.

Ceci est tout aussi valide une représentation de la même structure de données:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Mais à peu près seul PHP l'utilise, il y a peu de support pour ce format ailleurs.
Ceci est très courant et bien pris en charge également:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>

Il existe de nombreuses situations dans lesquelles vous devez transmettre des structures de données complexes sous forme de chaînes. La sérialisation, qui représente des structures de données arbitraires sous forme de chaînes, résout comment procéder.

déceler
la source
1
Votre explication semble se rapprocher de ce à quoi je m'attendais. pouvez-vous jeter un œil à ma modification?
Istiaque Ahmed
1
quelle est l'explication de ces a, i, s etc. dans a: 3: {i: 1; s: 6: "elem 1"; i: 2; s: 6: "elem 2"; i: 3; s: 7: "elem 3";}? Et si cela ne vous dérange pas, un exemple de sérialisation du tableau (peut ne pas être pertinent pour le thème de cet article) pour l'envoyer à js.
Istiaque Ahmed
2
Autant que je sache, il n'y a guère de spécification formelle de ce format à trouver, mais vous pouvez deviner, n'est-ce pas? i:1= entier 1, s:6:"elem 1"= chaîne de 6 caractères "elem 1" ... Et quel exemple demandez-vous, je pensais en avoir donné un?
deceze
"Mais comment passer ce tableau à Javascript? Array ([1] => elem 1 [2] => elem 2 [3] => elem 3)" ... juste l'extrait de code exact
Istiaque Ahmed
echo json_encode($array);La façon dont vous réussissez exactement dépend des circonstances. Ne soyez pas trop accro à cela.
deceze
27

Utilisation de 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);

Ce qui vous donne une sortie quelque chose comme ça

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;}}}

encore une fois si vous voulez récupérer le tableau d'origine, utilisez simplement la fonction PHP unserialize ()

$original_array=unserialize($serialized_array);
var_export($original_array);

J'espère que cela aidera

tipico
la source
7

Lorsque vous voulez rendre votre valeur php stockable, vous devez la transformer en valeur de chaîne, c'est ce que fait serialize () . Et unserialize () fait la chose inverse.

xdazz
la source
1
«stockable» qu'est-ce que cela signifie? J'avais parcouru la page dont vous parliez. pouvez-vous s'il vous plaît montrer un exemple en php et mysql (si nécessaire)?
Istiaque Ahmed
2
@Istiaque Ahmed Par exemple, lorsque vous souhaitez stocker un tableau dans un fichier sur le disque, vous ne pouvez pas enregistrer le tableau directement mais le transformer en une valeur stockable et c'est une chaîne.
xdazz
mais nous pouvons directement insérer une variable dans la base de données sans la sérialiser dans php mysql. explication s'il vous plaît.
Istiaque Ahmed
9
"Nous pouvons insérer une variable dans la base de données sans la sérialiser" . Cela n'est vrai que pour les types de données fondamentaux (chaînes, entier, nombres). Nous ne pouvons pas insérer des tableaux et des objets directement dans la base de données ou le système de fichiers. C'est pour cela serialize()et unserialize()sont faits pour.
lorenzo-s
Vous prenez des informations et travaillez avec elles dans votre script php prêt à les stocker / les envoyer quelque part. Vous avez la possibilité de créer une table qui correspond exactement aux données attendues, mais c'est fastidieux, vous doublez essentiellement votre charge de travail car vous devez également écrire du code qui correspond, et les modifications de la base de données nécessitent des modifications de code ou vice versa. Une fois sérialisé, vous pouvez simplement créer une table avec deux colonnes id int (10) et des informations BLOB. Serialise vous donne une chaîne à insérer et désérialiser renvoie les données à leur état d'origine. Il y a des cas où ce n'est pas le cas, les documents php les couvrent.
Chris
7
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Exécutez ce programme pour faire écho à la sortie

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}


ici
a = taille du tableau
i = nombre du nombre de tableaux
s = taille des valeurs du tableau

vous pouvez utiliser sérialiser pour stocker un tableau de données dans la base de données
et récupérer et UN-sérialiser les données à utiliser.

Manikandan
la source
6

La plupart des supports de stockage peuvent stocker des types de chaîne . Ils ne peuvent pas stocker directement une structure de données PHP telle qu'un tableau ou un objet, et ils ne le devraient pas, car cela couplerait le support de stockage de données avec PHP.

Au lieu de cela, serialize()vous permet de stocker l'une de ces structures sous forme de chaîne. Il peut être désérialisé de sa représentation sous forme de chaîne avec unserialize().

Si vous connaissez json_encode()et json_decode()(et JSON en général), le concept est similaire.

Alex
la source
familier avec json. encore obscurité dans la chose php. édité mon message
Istiaque Ahmed
Pourquoi faut-il sérialiser s'il y a un json_encode? Veuillez expliquer si vous savez. Merci.
Yevgeniy Afanasyev
1
@YevgeniyAfanasyev Peut-être que vous ne le faites pas pour certains sous-ensembles de données. Mais je pense qu'il serialize()est antérieur à JSON.
alex
5

S'il vous plaît! S'il vous plaît! S'il vous plaît! NE PAS sérialiser les données et les placer dans votre base de données. Serialize peut être utilisé de cette façon, mais il manque le point d'une base de données relationnelle et les types de données inhérents à votre moteur de base de données. Cela rend les données de votre base de données non portables, difficiles à lire et peut compliquer les requêtes. Si vous voulez que votre application soit portable dans d'autres langages, comme disons que vous trouvez que vous souhaitez utiliser Java pour une partie de votre application dans laquelle il est logique d'utiliser Java, la sérialisation deviendra une douleur dans les fesses. Vous devez toujours être en mesure d'interroger et de modifier les données de la base de données sans utiliser un outil intermédiaire tiers pour manipuler les données à insérer.

il est vraiment difficile de maintenir le code, le code avec des problèmes de portabilité et les données qu'il est plus difficile de migrer vers d'autres systèmes RDMS, un nouveau schéma, etc. les champs que vous avez sérialisés.

Cela ne veut pas dire que serialize () est inutile. Ce n'est pas ... Un bon endroit pour l'utiliser peut être un fichier cache contenant le résultat d'une opération intensive en données, par exemple. Il y en a des tonnes d'autres ... N'abusez pas de la sérialisation, car le prochain venu aura un cauchemar de maintenance ou de migration.

Un bon exemple de serialize () et unserialize () pourrait être comme ceci:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

Désérialiser sur la page

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
Avnish alok
la source
2
Le code fourni contient plusieurs vulnérabilités de sécurité, les personnes venant et copiant le code doivent être averties.
Daniel W.
Le code donné n'est qu'un exemple d'utilisation de la fonction searilize et unserialize.
Avnish alok le
2

Depuis http://php.net/manual/en/function.serialize.php :

Génère une représentation stockable d'une valeur. Ceci est utile pour stocker ou transmettre des valeurs PHP sans perdre leur type et leur structure.

Essentiellement, il prend un tableau ou un objet php et le convertit en une chaîne (que vous pouvez ensuite transmettre ou stocker comme bon vous semble).

Unserialize est utilisé pour reconvertir la chaîne en objet.

MrGlass
la source
quelle est l'explication de la «représentation stockable»?
Istiaque Ahmed
ive vu uniquement sérialiser utilisé quand quelqu'un voulait prendre un tableau php et le stocker dans une base de données. Vous pouvez sérialiser, stocker la sortie dans un champ de chaîne standard de votre base de données, puis la récupérer et la désérialiser lorsque vous souhaitez la réutiliser.
MrGlass
1

Fondamentalement, lorsque vous sérialisez des tableaux ou des objets, vous les transformez simplement en un format de chaîne valide afin de pouvoir les stocker facilement en dehors du script php.

  1. Utilisez sérialiser pour enregistrer l'état d'un objet dans la base de données (prenons la classe User comme exemple) Désérialisez ensuite les données pour charger l'état précédent sur l'objet (les méthodes ne sont pas un sérialiseur, vous devez inclure la classe d'objet pour pouvoir utiliser il)
    • personnalisation de l'utilisateur

Remarque pour l'objet, vous devez utiliser les méthodes magiques __sleep et __wakeup. __sleep est appelé par serialize (). Une méthode sleep renverra un tableau des valeurs de l'objet que vous souhaitez conserver.

__wakeup est appelé par unserialize (). Une méthode de réveil doit prendre les valeurs non sérialisées et les initialiser dans elles dans l'objet.

Pour passer des données entre php et js, vous utiliseriez json_encode pour transformer le tableau php au format json valide. Ou autre manière - utilisez JSON.parese () pour convertir une donnée de sortie (chaîne) en objet json valide. Vous voudriez faire cela pour utiliser le stockage local. (accès aux données hors ligne)

DevWL
la source
Pourquoi faut-il sérialiser s'il y a un json_encode? Veuillez expliquer si vous savez. Merci.
Yevgeniy Afanasyev
1
Vous pouvez bénéficier de la possibilité de personnaliser les méthodes magiques qui sont rassemblées lors de l'utilisation de la sérialisation et de la désérialisation. Cela dit, vous pouvez prendre Json_encode () et json_decode () beaucoup plus loin et chaque objet peut gérer cette functinos de sa manière unique. C'est pourquoi vous souhaitez les utiliser.
DevWL
1
Il y a bien plus que cela. Voir cette réponse pour plus d'informations stackoverflow.com/questions/804045/…
DevWL
1
json_encode est plus rapide (dépend de la version de PHP que vous utilisez), json décode en stdClass, l'objet sérilisé se désérialise en tant qu'instance de classe réelle, certaines configurations doivent être faites en JSON pour conserver le codage UTF-8 inchangé, la sérialisation ne change pas le codage. Si vous voulez faire en sorte que les données multi-plateformes utilisent JSON, si vous travaillez uniquement en PHP, vous pouvez utiliser la méthode magique __sleep et __wakeup pour personnaliser la sérialisation.
DevWL
0

Oui je peux. Supposons que nous ayons besoin de suivre votre système signifie que votre système a plus d'un administrateur et sous-administrateur, Tous ces éléments peuvent insérer, mettre à jour ou modifier des informations.Plus tard, vous devez savoir qui effectue cette modification. Pour résoudre ce problème, vous devez sérialiser.

  **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)

J'espère que cela t'aidera.


la source
-1
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');
X 47 48 - IR
la source