web-dev-qa-db-de.com

Sparen PHP Array zu MySQL?

Was ist ein guter Weg, um ein Datenarray in einem einzigen Mysql-Feld zu speichern? 

Auch wenn ich nach diesem Array in der MySQL-Tabelle frage, wie kann ich es dann wieder in die Array-Form bringen?

Ist serialisieren und unserialisieren die Antwort?

81
JasonDavis

Es gibt keine gute 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 , sind die Funktionen serialize() und unserialize() ausreichend der Trick. 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 Tabelle wie diese 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 solche Abfragen durchfü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 Funktion connect() gibt eine MySQL-Verbindungsressource zurück

function connect() {
    $c = mysql_connect($server, $username, $password);
    mysql_select_db('test');
    return $c;
}
83
Peter Lindqvist

Im Allgemeinen sind ja serialisieren und unserialisieren der Weg zu gehen.

Wenn Ihre Daten jedoch etwas einfach sind, ist das Speichern als durch Kommas getrennte Zeichenfolge wahrscheinlich besser für den Speicherplatz. Wenn Sie wissen, dass Ihr Array beispielsweise nur aus einer Liste von Zahlen besteht, sollten Sie implode/explode verwenden. Es ist der Unterschied zwischen 1,2,3 und a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}.

Wenn nicht, dann serialisieren Sie die Arbeit für alle Fälle.

26
Matchu

Verwenden Sie einfach die Funktion serialize PHP:

<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>

Wenn Sie jedoch einfache Arrays verwenden, können Sie auch implodieren und explodieren. Verwenden Sie anstelle von new ein leeres Array.

8
KramerC

Array serialisieren/Unserialize zur Speicherung in einer Datenbank

Besuchen Sie http://php.net/manual/de/function.serialize.php

Aus dem PHP Handbuch:

Siehe unter "Zurück" auf der Seite

Gibt eine Zeichenfolge zurück, die eine Bytestromdarstellung enthält, die an einem beliebigen Ort gespeichert werden kann.

Beachten Sie, dass dies eine binäre Zeichenfolge ist, die null Byte 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 unbedingt die Base64-Codierung vornehmen, da sonst die Serialisierungsfunktion beschädigt werden kann. 

Beispielcodierung: 

$YourSerializedData = base64_encode(serialize($theHTML));

$YourSerializedData kann jetzt in blob gespeichert werden.

Nachdem Sie Daten von blob erhalten haben, müssen Sie base64_decode und dann unserialize .__ verwenden. Beispiel Dekodierung:

$theHTML = unserialize(base64_decode($YourSerializedData));
8
seaBass

Der beste Weg, den ich für mich fand, ist das Speichern des Arrays als Datenstring mit Trennzeichen

$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);

$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";

Sie können dann mit einer einfachen Abfrage nach Daten suchen, die in Ihrem Array gespeichert sind

$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";

verwenden Sie die Funktion explode (), um den String "array_data" in ein Array zu konvertieren

$array = explode("array_separator", $array_data);

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 in eine Datenbank übernehmen, 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 value Integer oder boolean cast (int) (boolean) ist 

$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];

$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);
8
Harry

Serialize und unserialize sind dafür ziemlich üblich. Sie können JSON auch über json_encode und json_decode für ein weniger PHP-spezifisches Format verwenden.

5
ceejayoz

Wie bereits erwähnt - Wenn Sie nicht innerhalb des Arrays nach Daten suchen müssen, können Sie serialize verwenden - dies ist jedoch "nur PHP". Daher würde ich empfehlen, json_decode/json_encode - nicht nur für die Performance, sondern auch für die Portabilität zu verwenden!

4
Sebastian Lasse

Ich weiß nicht, warum jeder vorschlägt, das Array zu serialisieren.

Ich sage, der beste Weg ist, es tatsächlich in Ihr Datenbankschema einzufügen. Ich habe keine Ahnung (und Sie haben keine Anhaltspunkte gegeben) über die tatsächliche semantische Bedeutung der Daten in Ihrem Array, aber es gibt im Allgemeinen zwei Möglichkeiten, Sequenzen wie diese zu speichern

create table mydata (
  id int not null auto_increment primary key,
  field1 int not null,
  field2 int not null,
  ...
  fieldN int not null
)

Auf diese Weise speichern Sie Ihr Array in einer einzigen Zeile.

create table mydata (
    id int not null auto_increment primary key,
    ...
)

create table myotherdata (
    id int not null auto_increment primary key,
    mydata_id int not null,
    sequence int not null,
    data int not null
)

Der Nachteil der ersten Methode besteht natürlich darin, dass das Arbeiten mit dieser Tabelle nicht besonders elegant ist, wenn Sie viele Elemente in Ihrem Array haben. Das Arbeiten mit Sequenzen variabler Länge ist auch unpraktisch (möglich, aber auch ziemlich unelegant - nur die Spalten können auf Null gesetzt werden).

Für die zweite Methode können Sie Sequenzen beliebiger Länge haben, jedoch nur einen Typ. Sie können natürlich einen Typ varchar oder so etwas erstellen und die Elemente Ihres Arrays serialisieren. Nicht das Beste, was zu tun ist, aber sicherlich besser als das gesamte Array zu serialisieren, richtig?

In jedem Fall hat jede dieser Methoden den klaren Vorteil, auf ein beliebiges Element der Sequenz zugreifen zu können, und Sie müssen sich keine Gedanken über die Serialisierung von Arrays und hässlichen Dingen machen.

Um es zurückzubekommen. Holen Sie sich die entsprechende Zeile/Reihenfolge mit einer Abfrage und verwenden Sie eine Schleife .. oder?

3
shylent

Sie können Ihr Array als Json speichern.
Es gibt eine Dokumentation zum json-Datentyp: https://dev.mysql.com/doc/refman/5.7/de/json.html
Ich denke, dass dies die beste Lösung ist und Ihnen helfen wird, Ihren Code lesbarer zu halten, indem Sie verrückte Funktionen vermeiden.
Ich erwarte, dass dies für Sie hilfreich ist. 

2
Roberto Murguia

check out die implode-Funktion. Da sich die Werte in einem Array befinden, möchten Sie die Werte des Arrays in eine Mysql-Abfrage einfügen, die die Werte in eine Tabelle einfügt.

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

Wenn die Werte im Array Textwerte sind, müssen Sie Anführungszeichen hinzufügen

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

Wenn Sie keine doppelten Werte wünschen, schalten Sie "INto" auf "IGNORE" und nur eindeutige Werte werden in die Tabelle eingefügt.

1
user213559

Ich würde vorschlagen, implodieren/explodieren mit einem Zeichen, von dem Sie wissen, dass es nicht in den einzelnen Feldelementen enthalten ist. Dann speichern Sie es in SQL als String. 

1
user1478500

sie können ein serialisiertes Objekt (Array) in mysql einfügen, Beispiel serialize($object), und Sie können das Objektbeispiel unserialize($object) unserize

0
Vildan Bina

Ja, serialisieren/unserialisieren ist das, was ich in vielen Open-Source-Projekten am meisten gesehen habe.

0
Eduardo