webentwicklung-frage-antwort-db.com.de

speichern von Arrays in einer Datenbank

Ich versuche das Geschäft mehrere Zeilen in einer Datenbank. Die Anzahl der Felder ändert sich. Unten ist die Art, wie ich nur eine Zeile speichere.

  <?php

  if(isset($_POST['save'])){
      $wpdb->insert('wp_table_name',
          array(
              'field_a' => $_POST['field_a'],
              'field_b' => $_POST['field_b'],
              'field_c' => $_POST['field_c'],
              'field_d' => $_POST['field_d']             
              ),
          array(
              '%s',
              '%s',
              '%s',
              '%s'
              )
          );
  }
  ?>

  <form>
      <input type="text" name="field_a[]"/>
      <input type="text" name="field_b[]"/>
      <input type="text" name="field_c[]"/>
      <input type="text" name="field_d[]"/>

      <input type="text" name="field_a[]"/>
      <input type="text" name="field_b[]"/>
      <input type="text" name="field_c[]"/>
      <input type="text" name="field_d[]"/>

      <input type="text" name="field_a[]"/>
      <input type="text" name="field_b[]"/>
      <input type="text" name="field_c[]"/>
      <input type="text" name="field_d[]"/>

      <button type="submit" name="save">Save</button>
  </form>
1
user759235

Was WP für Arrays (und Objekte) in einigen Kontexten (wie Post-Feldern) tut, ist die Verwendung von maybe_serialize() / maybe_unserialize() , um solche Typen (und nur diese) zu und von serialisiert zu machen (String-typisierte) Darstellung.

Dies vereinfacht zwar den Workflow, bringt jedoch auch Nachteile mit sich, z. B. die Unfähigkeit, solche Daten ordnungsgemäß abzufragen, und häufig auftretende Probleme bei der Migration (Tools oder Aktionen, die die Serialisierung nicht kennen, können serialisierte Zeichenfolgen leicht ruinieren).

Wenn Sie die Kontrolle über das Design einer benutzerdefinierten Tabelle haben und diese einer bestimmten dedizierten Funktion dient, sollten Sie sie wahrscheinlich so entwerfen, dass Sie nicht ganze Arrays an erster Stelle speichern.

2
Rarst

Sie können Post-Meta mit demselben Metaschlüssel speichern. Setzen Sie einfach den Parameter $unique auf false.

if(isset($_POST['save'])){
    foreach ($_POST as $post_key => $post_value){
        if ( 'save' === $post_key )
            continue;
        if ( is_array($post_value) ) {
            foreach ( $post_value as $key => value ) {
                add_post_meta($post_id, $post_key . '[' . $key . ']', $post_value, false);
            }
        }
        else{
            add_post_meta($post_id, $post_key, $post_value, false);
        }
    }
}

Wenn Sie dann get_post_meta ( $post_id, $post_key, false ) aufrufen können, um alle Metawerte mit diesem bestimmten Metaschlüssel abzurufen.

Das ist natürlich so, wenn dies ein Beitrag war und Sie etwas speichern möchten, das mit diesem Beitrag zusammenhängt. Zum Beispiel, wenn Ihr Beitrag das Formular war und Sie die Übermittlungen als Metadaten für dieses bestimmte Formular (Beitrag) speichern möchten.

sonst würde ich nur 1 Einfügung in die Tabelle pro Feld auf einem Foreach machen, wie im obigen Beispiel, aber unter Verwendung der von Ihnen verwendeten $wpdb->insert()-Methode.

0
Jorge Rivera
<?php
if(isset($_POST['save'])){
      $wpdb->insert('wp_table_name',
          array(
              'field_a' => maybe_serialize( $_POST['field_a'] ),
              'field_b' => maybe_serialize( $_POST['field_b'] ),
              'field_c' => maybe_serialize( $_POST['field_c'] ),
              'field_d' => maybe_serialize( $_POST['field_d'] )             
              ),
          array(
              '%s',
              '%s',
              '%s',
              '%s'
              )
          );
}
?>

Verwenden Sie die Funktion maybe_unserialize, um den Wert als Array abzurufen.