Come usare php serialize () e unserialize ()


125

Il mio problema è molto semplice.

Non ho trovato alcun esempio per soddisfare le mie esigenze su cosa esattamente serialize()e unserialize()significhi in php? Forniscono solo un esempio: serializzare un array e mostrare un output in un formato inspiegabile. È davvero difficile capire il concetto di base attraverso il loro gergo.

MODIFICARE:

<?php

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

?>

produzione:

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

Non riesco a capire la seconda uscita. Oltre a ciò, qualcuno può fornire un esempio di una situazione in cui ho bisogno di serializzare un array php prima di usarlo?


10
Nel caso fossi ancora curioso dell '"output secondario", è abbastanza semplice: a = array, 3 = di dimensione tre elementi all'interno di {}. al suo interno, hai i = intero / indice uguale a 1, stringa di len 6 uguale a "elem 1", intero uguale a 2 .. ecc ecc. È abbastanza chiaro quando lo leggi in questo modo. Puoi immaginare che più livelli di array / oggetti siano facilmente contenuti all'interno, tuttavia la modifica è molto imprudente, dovresti davvero deserializzare, modificare, quindi serializzare per garantire la coerenza.
Grizly

2
@IstiaqueAhmed, Per quanto riguarda la "Qualcuno può dare un esempio di una situazione che ho bisogno di serializzare un array PHP prima di usarlo" , v'è un tale esempio a stackoverflow.com/a/30436890/632951
Pacerier

@grizly grazie amico, ho cercato una risposta del genere per due anni, non sapevo come spiegarla né come associare il motivo dell'utilizzo di quella funzione, grazie per la risposta
isaacewing

Risposte:


169

Un array o un oggetto PHP o un'altra struttura di dati complessa non possono essere trasportati, archiviati o utilizzati in altro modo al di fuori di uno script PHP in esecuzione . Se si desidera mantenere una struttura di dati così complessa oltre una singola esecuzione di uno script, è necessario serializzarla . Ciò significa semplicemente mettere la struttura in un "denominatore comune inferiore" che può essere gestito da cose diverse da PHP, come database, file di testo, socket. La funzione PHP standard serializeè solo un formato per esprimere una cosa del genere, serializza una struttura di dati in una rappresentazione di stringa che è unica per PHP e può essere invertita in un oggetto PHP usando unserialize. Esistono molti altri formati, come JSON o XML.


Prendi ad esempio questo problema comune:

Come passo un array PHP a Javascript?

PHP e Javascript possono comunicare solo tramite stringhe. Puoi passare la stringa "foo"molto facilmente a Javascript. Puoi passare il numero 1molto facilmente a Javascript. Puoi passare i valori booleani truee falsefacilmente a Javascript. Ma come si passa questo array a Javascript?

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

La risposta è la serializzazione . In caso di PHP / Javascript, JSON è in realtà il miglior formato di serializzazione:

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

Javascript può facilmente invertirlo in un vero array Javascript.

Questa è una rappresentazione altrettanto valida della stessa struttura dati:

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

Ma praticamente solo PHP lo usa, c'è poco supporto per questo formato altrove.
Questo è molto comune e anche ben supportato:

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

Esistono molte situazioni in cui è necessario trasferire strutture di dati complesse come stringhe. La serializzazione, che rappresenta strutture di dati arbitrarie come stringhe, risolve come farlo.


1
La tua spiegazione sembra avvicinarsi a quello che mi aspettavo. puoi dare un'occhiata alla mia modifica?
Istiaque Ahmed,

1
qual è la spiegazione di quegli a, i, s ecc. in a: 3: {i: 1; s: 6: "elem 1"; i: 2; s: 6: "elem 2"; i: 3; s: 7: "elem 3";}? E se non ti dispiace, un esempio di serializzazione dell'array (potrebbe non essere rilevante per il tema di questo post) per inviarlo a js.
Istiaque Ahmed

2
Per quanto ne so, non è possibile trovare una specifica formale di quel formato, ma puoi indovinare, vero? i:1= intero 1, s:6:"elem 1"= stringa con 6 caratteri "elem 1" ... E quale esempio chiedi, pensavo di averne dato uno?
inganno

"Ma come si passa questo array a Javascript? Array ([1] => elem 1 [2] => elem 2 [3] => elem 3)" ... solo lo snippet di codice esatto per esso
Istiaque Ahmed

echo json_encode($array);Il modo in cui passi esattamente dipende dalle circostanze. Non lasciarti prendere troppo da questo.
inganno

27

Utilizzo di 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);

Il che ti dà un output simile a questo

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

di nuovo se vuoi recuperare l'array originale usa la funzione PHP unserialize ()

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

Spero che questo possa aiutare


7

Quando vuoi rendere il tuo valore php memorizzabile, devi trasformarlo in un valore stringa, questo è ciò che fa serialize () . E unserialize () fa la cosa inversa.


1
'immagazzinabile' cosa significa? Avevo letto la pagina a cui mi riferivi. puoi per favore mostrare un esempio in php e mysql (se necessario)?
Istiaque Ahmed

2
@Istiaque Ahmed Ad esempio, quando si desidera memorizzare un array in un file sul disco, non è possibile salvare direttamente l'array ma convertirlo in un valore memorizzabile, ovvero una stringa.
xdazz

ma possiamo inserire direttamente una variabile nel database senza serializzarla in php mysql. spiegazione per favore.
Istiaque Ahmed

9
"Possiamo inserire una variabile nel database senza serializzarla" . Questo è vero solo per i tipi di dati fondamentali (stringhe, interi, numeri). Non possiamo inserire array e oggetti direttamente nel DB o nel filesystem. Ecco per cosa serialize()e unserialize()sono fatti.
lorenzo-s

Prendi alcune informazioni e ci lavori nel tuo script php pronto per memorizzarle / inviarle da qualche parte. Hai la possibilità di creare una tabella che corrisponda esattamente ai dati previsti, ma questo è noioso, stai essenzialmente raddoppiando il tuo carico di lavoro perché devi scrivere anche il codice che corrisponde, inoltre le modifiche nel database richiedono modifiche nel codice o viceversa. Quando serializzato puoi semplicemente creare una tabella con due colonne id int (10) e informazioni BLOB. Serialise ti dà una stringa da inserire e unserialize riporta i dati al loro stato originale. Ci sono casi che non succedono, i documenti php li coprono.
Chris

7
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Esegui questo programma per riprodurre l'output

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


qui
a = dimensione dell'array
i = conteggio del numero dell'array
s = dimensione dei valori dell'array

è possibile utilizzare serializzare per memorizzare un array di dati nel database
e recuperare e UN-serializzare i dati da utilizzare.


6

La maggior parte dei supporti di memorizzazione può memorizzare i tipi di stringa . Non possono memorizzare direttamente una struttura di dati PHP come un array o un oggetto e non dovrebbero, poiché ciò accoppierebbe il supporto di memorizzazione dati con PHP.

Invece, serialize()ti permette di memorizzare una di queste strutture come una stringa. Può essere deserializzato dalla sua rappresentazione di stringa con unserialize().

Se hai familiarità con json_encode()e json_decode()(e JSON in generale), il concetto è simile.


familiarità con json. ancora oscurità nella cosa php. ha modificato il mio post
Istiaque Ahmed

Perché è necessario serializzare se c'è un json_encode? Per favore, spiega se lo sai. Grazie.
Yevgeniy Afanasyev

1
@YevgeniyAfanasyev Forse non lo fai per alcuni sottoinsiemi di dati. Ma penso che sia serialize()precedente a JSON.
alex

5

Per favore! per favore! per favore! NON serializzare i dati e inserirli nel database. Serialize può essere utilizzato in questo modo, ma manca il punto di un database relazionale e i tipi di dati inerenti al motore di database. Ciò rende i dati nel database non portabili, difficili da leggere e può complicare le query. Se vuoi che la tua applicazione sia portabile in altri linguaggi, ad esempio supponiamo che tu scopra di voler utilizzare Java per alcune parti della tua app in cui ha senso usare Java, la serializzazione diventerà un problema per i glutei. Dovresti sempre essere in grado di interrogare e modificare i dati nel database senza utilizzare uno strumento intermediario di terze parti per manipolare i dati da inserire.

rende davvero difficile mantenere il codice, codice con problemi di portabilità e dati che è più difficile migrare ad altri sistemi RDMS, nuovo schema, ecc. Ha anche lo svantaggio aggiuntivo di rendere complicata la ricerca nel database in base a uno dei i campi che hai serializzato.

Questo non vuol dire che serialize () sia inutile. Non è ... Un buon posto per usarlo potrebbe essere un file di cache che contiene il risultato di un'operazione ad alta intensità di dati, per esempio. Ce ne sono molti altri ... Basta non abusare della serializzazione perché il prossimo ragazzo che arriverà avrà un incubo di manutenzione o migrazione.

Un buon esempio di serialize () e unserialize () potrebbe essere questo:

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

Annullare la serializzazione nella pagina

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}

2
Il codice fornito contiene diverse vulnerabilità di sicurezza, le persone che arrivano e che copiano il codice dovrebbero essere avvertite.
Daniel W.

Il codice fornito è solo un esempio di come utilizzare la funzione searilize e unserialize.
Avnish alok

2

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

Genera una rappresentazione memorizzabile di un valore. Questo è utile per memorizzare o trasferire valori PHP senza perdere il loro tipo e struttura.

Essenzialmente, prende un array o un oggetto php e lo converte in una stringa (che puoi quindi trasmettere o memorizzare come meglio credi).

Unserialize viene utilizzato per riconvertire la stringa in un oggetto.


qual è la spiegazione di "rappresentazione memorizzabile"?
Istiaque Ahmed

Ho visto solo serializzare usato quando qualcuno voleva prendere un array php e salvarlo in un database. È possibile serializzare, memorizzare l'output in un campo stringa standard nel database, quindi prenderlo e deserializzarlo quando si desidera utilizzarlo di nuovo.
MrGlass

1

Fondamentalmente, quando serializzi array o oggetti, lo trasformi semplicemente in un formato di stringa valido in modo da poterli memorizzare facilmente al di fuori dello script php.

  1. Usa serializzare per salvare lo stato di un oggetto nel database (prendiamo come esempio la classe User) Quindi deserializza i dati per caricare lo stato precedente sull'oggetto (i metodi non sono serializzatori devi includere la classe oggetto per poterli usare esso)
    • personalizzazione dell'utente

Nota per l'oggetto dovresti usare i metodi magic __sleep e __wakeup. __sleep è chiamato da serialize (). Un metodo sleep restituirà un array dei valori dell'oggetto che si desidera rendere persistente.

__wakeup è chiamato da unserialize (). Un metodo wakeup dovrebbe prendere i valori non serializzati e inizializzarli in essi nell'oggetto.

Per passare i dati tra php e js dovresti usare json_encode per trasformare l'array php in un formato json valido. O in altro modo: usa JSON.parese () per convertire un dato di output (stringa) in un oggetto json valido. Ti consigliamo di farlo per utilizzare l'archiviazione locale. (accesso ai dati offline)


Perché è necessario serializzare se c'è un json_encode? Per favore, spiega se lo sai. Grazie.
Yevgeniy Afanasyev

1
È possibile trarre vantaggio dalla possibilità di personalizzare il metodo magico che viene raccolto quando si utilizza serializzazione e deserializzazione. Detto questo, puoi prendere Json_encode () e json_decode () molto più lontano e ogni oggetto può gestire questo functino nel suo modo unico. Questo è il motivo per cui vorresti usarli.
DevWL

1
C'è di più, molto di più. Vedere questa risposta per ulteriori informazioni stackoverflow.com/questions/804045/...
DevWL

1
json_encode è più veloce (dipende dalla versione PHP che stai utilizzando), json decodifica come stdClass, oggetto serilizzato non serializzato come istanza di classe effettiva, Alcune configurazioni devono essere fatte a JSON per mantenere invariata la codifica UTF-8, serializzare non cambia la codifica. Se vuoi rendere i dati multipiattaforma usare JSON, se lavori solo in PHP potresti usare il metodo magico __sleep e __wakeup per personalizzare la serializzazione.
DevWL

0

Sì posso. Supponiamo che abbiamo bisogno di monitorare il tuo sistema significa che nel tuo sistema c'è più di un amministratore e sottoamministratore, tutti questi possono inserire o aggiornare o modificare qualsiasi informazione. Per risolvere questo problema è necessario serializzare.

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

Spero che questo ti possa aiutare.


-1
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.