web-dev-qa-db-fra.com

comment stocker des tableaux dans une base de données

J'essaye de stocker plusieurs lignes dans une base de données. Le nombre de champs va changer. Vous trouverez ci-dessous la façon dont je stocke une seule ligne.

  <?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

Ce que WP fait pour les tableaux (et les objets) dans certains contextes (tels que les champs de publication) utilise maybe_serialize() / maybe_unserialize() pour transformer ces types (et seulement eux) en série et en série Représentation (à chaîne).

Bien que cela simplifie le flux de travail, il entraîne des pénalités, telles que l'impossibilité d'interroger correctement ces données et les problèmes courants liés à la migration (des outils ou des actions ne prenant pas conscience de la sériazlisation ruinent facilement les chaînes sérialisées).

Si vous avez le contrôle de la conception de la table personnalisée et que celle-ci remplit une fonction spécifique, vous devez probablement la concevoir de manière à ne pas stocker les tableaux entiers en premier lieu.

2
Rarst

Vous pouvez enregistrer des méta-publications avec la même clé méta. Il suffit de définir le paramètre $unique sur 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);
        }
    }
}

Ensuite, lorsque vous pouvez appeler get_post_meta ( $post_id, $post_key, false ) pour récupérer toutes les méta-valeurs avec cette clé méta particulière.

Bien sûr, s’il s’agissait d’un message et que vous souhaitez enregistrer un élément lié à ce message. Par exemple, si votre message était le formulaire et que vous souhaitez utiliser les données comme méta-données pour ce formulaire spécifique (message).

sinon, je ferais juste 1 insertion dans la table par champ sur un foreach comme l'exemple que j'ai donné ci-dessus mais en utilisant la méthode $wpdb->insert() que vous avez utilisée.

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'
              )
          );
}
?>

Utilisez la fonction Maybe_unserialize pour obtenir la valeur sous forme de tableau.

0