Verwendung von php serialize () und unserialize ()

125

Mein Problem ist sehr einfach.

Ich habe kein Beispiel gefunden, um meine Bedürfnisse zu erfüllen, was genau serialize()und was unserialize()in PHP bedeutet. Sie geben nur ein Beispiel - serialisieren Sie ein Array und zeigen Sie eine Ausgabe in einem ungeklärten Format. Es ist wirklich schwer, das Grundkonzept zu verstehen, das durch ihren Jargon geht.

BEARBEITEN:

<?php

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

?>

Ausgabe:

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

Ich kann die zweite Ausgabe nicht verstehen. Kann jemand ein Beispiel für eine Situation geben, in der ich ein PHP-Array serialisieren muss, bevor ich es verwende?

Istiaque Ahmed
quelle
10
Falls Sie immer noch neugierig auf die "sekundäre Ausgabe" waren, ist dies ziemlich einfach: a = Array, 3 = Elemente der Größe drei innerhalb der {}. Darin haben Sie i = Integer / Index gleich 1, String von Len 6 gleich "elem 1", Integer gleich 2 .. etc etc .. Es ist ziemlich klar, wenn Sie es so lesen. Sie können sich vorstellen, dass mehrere Ebenen von Arrays / Objekten leicht darin enthalten sind. Änderungen sind jedoch sehr unklug. Sie sollten Änderungen wirklich unserialisieren und dann serialisieren, um die Konsistenz sicherzustellen.
Grizly
2
@IstiaqueAhmed, Bezüglich "Kann jemand ein Beispiel für eine Situation geben, in der ich ein PHP-Array serialisieren muss, bevor ich es verwende" gibt es ein solches Beispiel unter stackoverflow.com/a/30436890/632951
Pacerier
@grizly danke Mann, ich habe seit zwei Jahren nach einer solchen Antwort gesucht, ich wusste nicht, wie ich sie erklären oder wie ich den Grund für die Verwendung dieser Funktion
zuordnen sollte

Antworten:

169

Ein PHP-Array oder -Objekt oder eine andere komplexe Datenstruktur kann nicht außerhalb eines laufenden PHP-Skripts transportiert, gespeichert oder anderweitig verwendet werden . Wenn Sie eine so komplexe Datenstruktur über einen einzelnen Skriptlauf hinaus beibehalten möchten , müssen Sie sie serialisieren . Das bedeutet nur, die Struktur in einen "kleineren gemeinsamen Nenner" zu bringen, der von anderen Dingen als PHP wie Datenbanken, Textdateien und Sockets verarbeitet werden kann. Die Standard-PHP-Funktion serializeist nur ein Format , um so etwas auszudrücken. Sie serialisiert eine Datenstruktur in eine Zeichenfolgendarstellung, die nur für PHP gilt und mithilfe von in ein PHP-Objekt umgewandelt werden kann unserialize. Es gibt jedoch viele andere Formate wie JSON oder XML.


Nehmen Sie zum Beispiel dieses häufige Problem:

Wie übergebe ich ein PHP- Array an Javascript?

PHP und Javascript können nur über Strings kommunizieren. Sie können die Zeichenfolge "foo"sehr einfach an Javascript übergeben. Sie können die Nummer 1sehr einfach an Javascript übergeben. Sie können die Booleschen Werte übergeben trueund falseleicht zu Javascript. Aber wie übergeben Sie dieses Array an Javascript?

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

Die Antwort lautet Serialisierung . Im Falle von PHP / Javascript ist JSON tatsächlich das bessere Serialisierungsformat:

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

Javascript kann dies leicht in ein tatsächliches Javascript-Array umkehren.

Dies ist jedoch eine ebenso gültige Darstellung derselben Datenstruktur:

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

Aber so ziemlich nur PHP verwendet es, es gibt nirgendwo anders Unterstützung für dieses Format.
Dies ist jedoch sehr verbreitet und wird auch gut unterstützt:

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

Es gibt viele Situationen, in denen Sie komplexe Datenstrukturen als Zeichenfolgen übergeben müssen. Die Serialisierung, die beliebige Datenstrukturen als Zeichenfolgen darstellt, löst die Vorgehensweise.

täuschen
quelle
1
Ihre Erklärung scheint sich dem zu nähern, was ich erwartet hatte. Kannst du dir bitte meine Bearbeitung ansehen?
Istiaque Ahmed
1
Was ist die Erklärung für diese a, i, s usw. in a: 3: {i: 1; s: 6: "elem 1"; i: 2; s: 6: "elem 2"; i: 3; s: 7: "elem 3";}? Und wenn es Ihnen nichts ausmacht, ein Beispiel für die Serialisierung des Arrays (möglicherweise nicht relevant für das Thema dieses Beitrags), um es an js zu senden.
Istiaque Ahmed
2
Soweit mir bekannt ist, gibt es kaum eine formale Spezifikation dieses Formats, aber Sie können es erraten, nicht wahr? i:1= Ganzzahl 1, s:6:"elem 1"= Zeichenfolge mit 6 Zeichen "elem 1" ... Und nach welchem ​​Beispiel fragst du, ich dachte, ich hätte eines gegeben?
Täuschung
"Aber wie übergibt man dieses Array an Javascript? Array ([1] => elem 1 [2] => elem 2 [3] => elem 3)" ... nur das genaue Code-Snippet dafür
Istiaque Ahmed
echo json_encode($array);Wie genau Sie passieren sie von den Umständen abhängt. Lass dich nicht zu sehr darauf ein.
Täuschung
27

PHP serialize () unserialize () Verwendung

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

Welches gibt Ihnen eine Ausgabe so etwas

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

Wenn Sie das ursprüngliche Array wiederherstellen möchten, verwenden Sie einfach die Funktion PHP unserialize ()

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

Ich hoffe das wird helfen

tipico
quelle
7

Wenn Sie Ihren PHP-Wert speicherbar machen möchten, müssen Sie ihn in einen String-Wert umwandeln, genau wie serialize () . Und unserialize () macht das Gegenteil.

xdazz
quelle
1
"speicherbar" was bedeutet das? Ich hatte die Seite durchgesehen, auf die du verwiesen hast. Kannst du bitte ein Beispiel in PHP und MySQL zeigen (falls nötig)?
Istiaque Ahmed
2
@Istiaque Ahmed Wenn Sie beispielsweise ein Array in einer Datei auf der Festplatte speichern möchten, können Sie das Array nicht direkt speichern, sondern in einen speicherbaren Wert umwandeln, und das ist eine Zeichenfolge.
Xdazz
aber wir können eine Variable direkt in die Datenbank einfügen, ohne sie in PHP MySQL zu serialisieren. Erklärung bitte.
Istiaque Ahmed
9
"Wir können eine Variable in die Datenbank einfügen, ohne sie zu serialisieren" . Dies gilt nur für grundlegende Datentypen (Zeichenfolgen, Ganzzahlen, Zahlen). Wir können Arrays und Objekte nicht direkt in die Datenbank oder das Dateisystem einfügen . Das ist , was serialize()und unserialize()ist gemacht für.
Lorenzo-s
Sie nehmen einige Informationen und arbeiten damit in Ihrem PHP-Skript, um sie irgendwo zu speichern / zu senden. Sie haben die Möglichkeit, eine Tabelle zu erstellen, die genau mit den erwarteten Daten übereinstimmt. Dies ist jedoch mühsam. Sie verdoppeln im Wesentlichen Ihre Arbeitslast, da Sie auch übereinstimmenden Code schreiben müssen. Außerdem müssen Änderungen an der Datenbank Änderungen am Code erfordern oder umgekehrt. Bei der Serialisierung können Sie einfach eine Tabelle mit den zwei Spalten id int (10) und information BLOB erstellen. Serialise gibt Ihnen eine Zeichenfolge zum Einfügen und unserialize bringt die Daten in ihren ursprünglichen Zustand zurück. Es gibt Fälle, in denen dies nicht der Fall ist. Die PHP-Dokumente decken diese ab.
Chris
7
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Führen Sie dieses Programm aus, um die Ausgabe wiederzugeben

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


hier
a = Größe des Arrays
i = Anzahl der Array-Nummern
s = Größe der Array-Werte

Sie können serialize verwenden, um ein Array von Daten in der Datenbank zu speichern,
und Daten zur Verwendung abrufen und UN-serialisieren.

Manikandan
quelle
6

Die meisten Speichermedien können Zeichenfolgentypen speichern . Sie können eine PHP-Datenstruktur wie ein Array oder ein Objekt nicht direkt speichern und sollten dies auch nicht, da dies das Datenspeichermedium mit PHP koppeln würde.

serialize()Ermöglicht es Ihnen stattdessen, eine dieser Strukturen als Zeichenfolge zu speichern. Es kann von seiner Zeichenfolgendarstellung mit de-serialisiert werden unserialize().

Wenn Sie mit json_encode()und json_decode()(und JSON im Allgemeinen) vertraut sind , ist das Konzept ähnlich.

Alex
quelle
vertraut mit json. immer noch Dunkelheit in der PHP-Sache. bearbeitet meinen Beitrag
Istiaque Ahmed
Warum muss man serialisieren, wenn es einen json_encode gibt? Bitte erklären Sie, wenn Sie wissen. Vielen Dank.
Jewgenij Afanasjew
1
@YevgeniyAfanasyev Vielleicht nicht für einige Teilmengen von Daten. Aber ich denke serialize()vor JSON.
Alex
5

Bitte! Bitte! Bitte! Serialisieren Sie KEINE Daten und platzieren Sie sie in Ihrer Datenbank. Serialize kann auf diese Weise verwendet werden, aber es fehlen der Punkt einer relationalen Datenbank und die Datentypen, die Ihrem Datenbankmodul inhärent sind. Dadurch werden Daten in Ihrer Datenbank nicht portierbar, schwer lesbar und können Abfragen erschweren. Wenn Sie möchten, dass Ihre Anwendung auf andere Sprachen portierbar ist, z. B. wenn Sie feststellen, dass Sie Java für einen Teil Ihrer App verwenden möchten, in dem die Verwendung von Java sinnvoll ist, wird die Serialisierung zu einem Problem für das Gesäß. Sie sollten immer in der Lage sein, Daten in der Datenbank abzufragen und zu ändern, ohne ein Vermittlungstool eines Drittanbieters zum Bearbeiten der einzufügenden Daten zu verwenden.

Es macht es wirklich schwierig, Code, Code mit Portabilitätsproblemen und Daten zu verwalten, bei denen die Migration auf andere RDMS-Systeme, neue Schemata usw. schwieriger ist. Außerdem hat es den zusätzlichen Nachteil, dass die Suche in Ihrer Datenbank anhand eines der folgenden Probleme unübersichtlich wird die Felder, die Sie serialisiert haben.

Das heißt nicht, dass serialize () nutzlos ist. Es ist nicht ... Ein guter Ort, um es zu verwenden, kann eine Cache-Datei sein, die beispielsweise das Ergebnis einer datenintensiven Operation enthält. Es gibt Unmengen anderer ... Missbrauche Serialisierung nur nicht, weil der nächste Typ, der mitkommt, einen Wartungs- oder Migrationsalptraum hat.

Ein gutes Beispiel für serialize () und unserialize () könnte folgendermaßen aussehen:

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

Unserialize auf der Seite

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
Avnish alok
quelle
2
Der bereitgestellte Code enthält mehrere Sicherheitslücken. Personen, die vorbeikommen und Code einfügen, sollten gewarnt werden.
Daniel W.
Der angegebene Code ist nur ein Beispiel für die Verwendung der Searilize- und Unserialize-Funktion.
Avnish alok
2

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

Erzeugt eine speicherbare Darstellung eines Wertes. Dies ist nützlich, um PHP-Werte zu speichern oder weiterzugeben, ohne ihren Typ und ihre Struktur zu verlieren.

Im Wesentlichen nimmt es ein PHP-Array oder -Objekt und konvertiert es in eine Zeichenfolge (die Sie dann nach Belieben übertragen oder speichern können).

Mit Unserialize wird die Zeichenfolge wieder in ein Objekt konvertiert.

MrGlass
quelle
Was ist die Erklärung für "speicherbare Repräsentation"?
Istiaque Ahmed
Ich habe Serialize nur gesehen, wenn jemand ein PHP-Array nehmen und in einer Datenbank speichern wollte. Sie können serialisieren, die Ausgabe in einem Standardzeichenfolgenfeld in Ihrer Datenbank speichern und sie dann abrufen und unserialisieren, wenn Sie sie erneut verwenden möchten.
MrGlass
1

Wenn Sie Arrays oder Objekte serialisieren, wandeln Sie sie einfach in ein gültiges Zeichenfolgenformat um, damit Sie sie problemlos außerhalb des PHP-Skripts speichern können.

  1. Verwenden Sie serialize, um den Status eines Objekts in der Datenbank zu speichern (nehmen wir als Beispiel die User-Klasse). Als nächstes können Sie die Daten unserialisieren, um den vorherigen Status wieder in das Objekt zu laden (Methoden sind keine Serializer, für deren Verwendung Sie eine Objektklasse einschließen müssen es)
    • Benutzerpersonalisierung

Hinweis für Objekte: Verwenden Sie die Methoden Magic __sleep und __wakeup. __sleep wird von serialize () aufgerufen. Eine Sleep-Methode gibt ein Array der Werte des Objekts zurück, das Sie beibehalten möchten.

__wakeup wird von unserialize () aufgerufen. Eine Aufweckmethode sollte die unserialisierten Werte nehmen und sie im Objekt initialisieren.

Zum Übergeben von Daten zwischen PHP und JS würden Sie Json_encode verwenden, um das PHP-Array in ein gültiges JSON-Format zu verwandeln. Oder umgekehrt: Verwenden Sie JSON.parese (), um Ausgabedaten (Zeichenfolgen) in gültige JSON-Objekte zu konvertieren. Sie möchten dies tun, um den lokalen Speicher zu nutzen. (Offline-Datenzugriff)

DevWL
quelle
Warum muss man serialisieren, wenn es einen json_encode gibt? Bitte erklären Sie, wenn Sie wissen. Vielen Dank.
Jewgenij Afanasjew
1
Sie können von der Möglichkeit profitieren, magische Methoden anzupassen, die bei der Verwendung von Serialize und Unserialise zusammengestellt werden. Das heißt, Sie können Json_encode () und json_decode () viel weiter nehmen und jedes Objekt kann diese Funktionen auf seine einzigartige Weise handhaben. Deshalb möchten Sie sie verwenden.
DevWL
1
Es steckt noch viel mehr dahinter. Weitere Informationen finden
DevWL
1
json_encode ist schneller (abhängig von der von Ihnen verwendeten PHP-Version), json dekodiert als stdClass, serilisiertes Objekt unserialisiert als tatsächliche Klasseninstanz. Einige Konfigurationen wurden an JSON vorgenommen, um die UTF-8-Codierung unverändert beizubehalten. Serialize ändert die Codierung nicht. Wenn Sie möchten, dass Daten plattformübergreifend JSON verwenden. Wenn Sie nur in PHP arbeiten, können Sie die magische Methode __sleep und __wakeup verwenden, um die Serialisierung anzupassen.
DevWL
0

Ja, ich kann. Angenommen, wir müssen Ihre Systemmittel nachverfolgen. In Ihrem System gibt es mehr als einen Administrator und einen Subadmin. Alle diese Informationen können Informationen einfügen, aktualisieren oder bearbeiten. Später müssen Sie wissen, wer diese Änderung vornimmt. Um dieses Problem zu lösen, müssen Sie serialisieren.

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

Ich hoffe, dies wird dir helfen.


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