web-dev-qa-db-ja.com

データベースに配列を格納する方法

データベースに複数の行を格納しようとしています。フィールド数が変わります。以下は、1行だけを格納するために使用する方法です。

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

いくつかのコンテキスト(投稿フィールドなど)で配列(およびオブジェクト)に対してWPが実行することは、 maybe_serialize() / maybe_unserialize() を使用して、そのような型(およびそれらのみ)をシリアライズしたりシリアライズしたりすることです(文字列型)表現.

これによりワークフローが単純化されますが、そのようなデータを正しく照会できないことや移行に関する一般的な問題(シリアル化を意識しないツールやアクションによってシリアル化された文字列が簡単に破壊されるなど)が発生します。

もしあなたがカスタムテーブルのデザインをコントロールでき、それが特定の専用機能を果たすならば - あなたはおそらくあなたが最初に全体の配列を格納しないようにそれをデザインするべきです。

2
Rarst

ポストメタを同じメタキーで保存することができます。$uniqueパラメータを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);
        }
    }
}

その後、get_post_meta ( $post_id, $post_key, false )を呼び出して、その特定のメタキーを持つすべてのメタ値を取得できます。

もちろんこれが投稿であり、その投稿に関連したものを保存したいのであれば。例えばあなたの投稿がフォームで、その投稿をその特定のフォームのメタデータとして保存したい場合(投稿)。

さもなければ私はちょうど私が上で与えた例のようにしかしあなたが使った$wpdb->insert()メソッドを使ってforeachの上のフィールドごとにテーブルへの1挿入をするでしょう。

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

Maybe_unserialize関数を使用して値を配列として取得します。