Es gibt nichts Gutes Möglichkeit, ein Array in einem einzelnen Feld zu speichern.
Sie müssen Ihre relationalen Daten untersuchen und die entsprechenden Änderungen an Ihrem Schema vornehmen. Im folgenden Beispiel finden Sie einen Verweis auf diesen Ansatz.
Wenn Sie das Array in einem einzelnen Feld speichern müssen , dann das serialize()
undunserialize()
reichen die Funktionen . Sie können jedoch keine Abfragen zum tatsächlichen Inhalt durchführen.
Alternativ zur Serialisierungsfunktion gibt es auch json_encode()
und json_decode()
.
Betrachten Sie das folgende Array
$a = array(
1 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
2 => array(
'a' => 1,
'b' => 2,
'c' => 3
),
);
Um es in der Datenbank zu speichern, müssen Sie eine solche Tabelle erstellen
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
'DROP TABLE IF EXISTS test');
$r = mysql_query(
'CREATE TABLE test (
id INTEGER UNSIGNED NOT NULL,
a INTEGER UNSIGNED NOT NULL,
b INTEGER UNSIGNED NOT NULL,
c INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
)');
Um mit den Datensätzen zu arbeiten, können Sie Abfragen wie diese ausführen (und ja, dies ist ein Beispiel, Vorsicht!).
function getTest() {
$ret = array();
$c = connect();
$query = 'SELECT * FROM test';
$r = mysql_query($query,$c);
while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
$ret[array_shift($o)] = $o;
}
mysql_close($c);
return $ret;
}
function putTest($t) {
$c = connect();
foreach ($t as $k => $v) {
$query = "INSERT INTO test (id,".
implode(',',array_keys($v)).
") VALUES ($k,".
implode(',',$v).
")";
$r = mysql_query($query,$c);
}
mysql_close($c);
}
putTest($a);
$b = getTest();
Die connect()
Funktion gibt eine MySQL-Verbindungsressource zurück
function connect() {
$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
return $c;
}
Verwenden Sie einfach die Funktion zum Serialisieren von PHP:
Wenn Sie jedoch einfache Arrays wie dieses verwenden, können Sie auch implodieren und explodieren verwenden. Verwenden Sie ein leeres Array anstelle eines neuen.
quelle
Serialize / Unserialize-Array zur Speicherung in einer DB
Besuchen Sie http://php.net/manual/en/function.serialize.php
Aus dem PHP-Handbuch:
Schauen Sie auf der Seite unter "Zurück" nach
Gibt eine Zeichenfolge zurück, die eine Byte-Stream-Darstellung des Werts enthält, der überall gespeichert werden kann.
Beachten Sie, dass dies eine binäre Zeichenfolge ist, die Null-Bytes enthalten kann und als solche gespeichert und behandelt werden muss. Beispielsweise sollte die Ausgabe von serialize () im Allgemeinen in einem BLOB-Feld in einer Datenbank und nicht in einem CHAR- oder TEXT-Feld gespeichert werden.
Hinweis: Wenn Sie HTML in einem Blob speichern möchten, müssen Sie es unbedingt mit base64 codieren, da sonst die Serialisierungsfunktion unterbrochen werden kann.
Beispielcodierung:
$YourSerializedData
ist jetzt bereit, im Blob gespeichert zu werden.Nachdem Sie Daten vom Blob erhalten haben, müssen Sie base64_decode und dann unserialisieren. Beispieldecodierung:
quelle
Der beste Weg, den ich für mich gefunden habe, ist das Speichern eines Arrays als Datenzeichenfolge mit Trennzeichen
Sie können dann mit einfacher Abfrage nach Daten suchen, die in Ihrem Array gespeichert sind
Verwenden Sie die Funktion explode (), um die Zeichenfolge "array_data" in ein Array zu konvertieren
Beachten Sie, dass dies nicht mit mehrdimensionalen Arrays funktioniert, und stellen Sie sicher, dass Ihr "array_separator" eindeutig ist und in Array-Werten nicht vorhanden war.
Achtung !!! Wenn Sie nur Formulardaten nehmen und in die Datenbank stellen, befinden Sie sich in einer Falle, da die Formulardaten nicht SQL-sicher sind! Sie müssen Ihren Formularwert mit mysql_real_escape_string behandeln oder wenn Sie MySQLi mysqli :: real_escape_string verwenden oder wenn der Wert eine Ganzzahl oder eine boolesche Umwandlung (int) (boolean) ist
quelle
Serialisieren und unserialisieren sind dafür ziemlich üblich. Sie können JSON auch über json_encode und json_decode für ein weniger PHP-spezifisches Format verwenden.
quelle
Wie bereits erwähnt - Wenn Sie nicht nach Daten innerhalb des Arrays suchen müssen, können Sie serialize verwenden - dies ist jedoch "nur PHP". Daher würde ich empfehlen, json_decode / json_encode zu verwenden - nicht nur für die Leistung, sondern auch für die Lesbarkeit und Portabilität (andere Sprachen wie Javascript können mit json_encodierten Daten umgehen).
quelle
Ich weiß nicht, warum jeder vorschlägt, das Array zu serialisieren.
Ich sage, der beste Weg ist, es tatsächlich in Ihr Datenbankschema zu integrieren. Ich habe keine Ahnung (und Sie haben keine Hinweise gegeben) über die tatsächliche semantische Bedeutung der Daten in Ihrem Array, aber es gibt im Allgemeinen zwei Möglichkeiten, solche Sequenzen zu speichern
Auf diese Weise speichern Sie Ihr Array in einer einzelnen Zeile.
Der Nachteil der ersten Methode besteht natürlich darin, dass die Arbeit mit dieser Tabelle nicht die eleganteste Sache ist, wenn Sie viele Elemente in Ihrem Array haben. Es ist auch unpraktisch (möglich, aber auch ziemlich unelegant - machen Sie die Spalten einfach nullbar), mit Sequenzen variabler Länge zu arbeiten.
Bei der zweiten Methode können Sie Sequenzen beliebiger Länge, jedoch nur eines Typs verwenden. Sie können natürlich diesen einen Typ varchar oder so machen und die Elemente Ihres Arrays serialisieren. Nicht das Beste, aber sicherlich besser, als das gesamte Array zu serialisieren, oder?
In beiden Fällen hat jede dieser Methoden den klaren Vorteil, auf ein beliebiges Element der Sequenz zugreifen zu können, und Sie müssen sich nicht um die Serialisierung von Arrays und solche hässlichen Dinge kümmern.
Wie für die Rückgabe. Holen Sie sich die entsprechende Zeile / Folge von Zeilen mit einer Abfrage und verwenden Sie eine Schleife . Richtig?
quelle
Sie können Ihr Array als JSON speichern.
Es gibt eine Dokumentation für den json-Datentyp: https://dev.mysql.com/doc/refman/5.7/en/json.html
Ich denke, dies ist die beste Lösung und hilft Ihnen, Ihren Code besser lesbar zu halten, indem Sie verrückte Funktionen vermeiden .
Ich gehe davon aus, dass dies für Sie hilfreich ist.
quelle
Ja, serialisieren / unserialisieren ist das, was ich in vielen Open Source-Projekten am meisten gesehen habe.
quelle
Ich würde vorschlagen, implode / explode mit einem Zeichen zu verwenden, von dem Sie wissen, dass es in keinem der einzelnen Array-Elemente enthalten ist. Speichern Sie es dann in SQL als Zeichenfolge.
quelle
Schauen Sie sich die Implodierungsfunktion an, da sich die Werte in einem Array befinden. Sie möchten die Werte des Arrays in eine MySQL-Abfrage einfügen, die die Werte in eine Tabelle einfügt.
Wenn die Werte im Array Textwerte sind, müssen Sie Anführungszeichen hinzufügen
Wenn Sie keine doppelten Werte wünschen, schalten Sie "INto" auf "IGNORE" und es werden nur eindeutige Werte in die Tabelle eingefügt.
quelle
Sie können ein serialisiertes Objekt (Array) in ein
serialize($object)
MySQL-Beispiel einfügen und ein Beispiel für ein unserize-Objekt erstellenunserialize($object)
quelle
Anstatt es in der Datenbank zu speichern, speichern Sie es in einer Datei und rufen Sie es später auf.
Viele PHP-Apps (wie Sugarcrm) verwenden einfach var_export, um alle Daten des Arrays in eine Datei zu übertragen. Folgendes speichere ich zum Speichern meiner Konfigurationsdaten:
Ich denke, dies ist ein besserer Weg, um Ihre Daten zu speichern!
quelle