質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

3回答

42246閲覧

データベースに配列を格納したいのですがうまくいきません。

t33

総合スコア33

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

2クリップ

投稿2016/12/10 01:48

データベースに1次元配列を保存したいのですが、うまくいきません。
動かないのですが、イメージとしてソースをアップ致しました。
初心者で申し訳ありませんが、よろしくお願い致します。


備考
・MariaDBを使用しています。
・配列をセットするときに適切なデータベースの「データ型」が分かりません(例えば、VARCHAR(30)のようなもの)
・PHPの変数「tdata」に1次元配列のデータが格納されています。


PHP

1try { 2 $this->pdo->beginTransaction(); 3 4 5 //データベースのtestテーブルにtdata(1次元配列)を格納する 6 $sql = "INSERT INTO test (tdata) 7 VALUES ( :tdata)"; 8 9 $stmh = $this->pdo->prepare($sql); 10 $stmh->bindValue(':tdata', tdata, PDO::PARAM_STR ); //ここもPDO::PARAM_STRで大丈夫でしょうか・・ 11 $stmh->execute(); 12 $this->pdo->commit(); 13 } catch (PDOException $Exception) { 14 $this->pdo->rollBack(); 15 print "エラー:" . $Exception->getMessage(); 16 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

RDBの基本的なルールとして、一行の一カラムには構造を持ったデータを入れず、単一のデータを入れる、というものがあります。第一正規化と呼ばれるルールです。
それに従うと、配列を格納できないというのは正しいことです。

ではtdataをどう保存するかです。
配列が10件あるのなら、10行に分けて格納するのがRDBの使い方です。

投稿2016/12/10 03:25

yuba

総合スコア5570

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2016/12/10 04:07 編集

ご返信ありがとうございます。 RDBの基本ルールとして、配列を格納出来ないことを知ることが出来ました。 配列の中身が1000近くある為、どうすればよいか悩んでいます。 そこで以下の方法を考えました。 ①配列の中身をそれぞれ取り出して、カンマで区切ってデータベースに保存する(カラムは1つ) ②配列の中身毎にカラムをそれぞれ作成して、各カラムに保存する(カラム約1000) ①の方法を試そうかと思っています。(この方法が好ましくなく、他によい方法があればご教授頂けるとうれしいです。)
motuo

2016/12/10 04:24

カンマで区切ってデータベースに保存したい理由は何でしょうか? 通常、設計をする時にはyubaさんがおっしゃるとおり正規化をして、1000行に分けてデータを登録することがRDB本来の使い方と思います。 また、カラムの長さの定義がとても長くなってしまう事も気になります。SQL等で加工する際にも扱いづらいのでは? (1000カラムもあるのではなおの事、大変と思いますよ。) 配列で格納したデータは、正規化したデータを取り出す時に再び配列に入れてあげれば 良いのではないでしょうか。
t33

2016/12/10 04:54 編集

カンマで区切ってデータベースに保存したい理由は何でしょうか? ⇒1000カラムになるのは避けたかったので、1カラムにしたかったからです。 (例えば配列データがtdata[0]→test0 tdata[1]→test1 なら 「test0,test1・・・」を1カラムに保存) 「1000行に分けてデータを登録する」がちょっと分かっていないようです。。 「1000行に分けてデータを登録する」=「1000のカラムに配列データをそれぞれ1つずつ 保存する」だと思ったのですが、この認識が違ったかもしれないです。 具体的にはどのような感じになるのでしょうか。
motuo

2016/12/10 04:58

下記の私の回答にも書きましたが、配列の中の値を別のテーブルに格納してあげる方法です。 【例】 仮に下記の3つがプログラムにあるとします。 ①テーブル全体の主キー⇒仮に"1"とします。 ②配列を一意に決めるキー⇒仮に"A"とします。 ③1,000個の要素を持つ配列 とすると、まず、主キーの情報を格納するTableAをCreateします。 主キー | 配列キー *************** "1" | "A" さらに配列の内容を格納するTableBをcreateします。この時に、配列の情報を復元できるように Keyに配列のKey(この場合は"A")を設定します。 配列キー | 配列の内容 *************** "A"   | "あいうえお" "A"   | "かきくけこ" ×1000 こうすれば、プログラムのアルゴリズムとして、まずはTableAから主キー("1")より配列キー("A")を取得。 この("A")をキーにしてTableBをSelect。 そうすると結果は、"あいうえお","かきくけこ",…×1000となりますよね。
t33

2016/12/10 05:17

motuoさんの詳細の説明で理解出来ました。本当にありがとうございます。 早速試してみます。
guest

0

汎用機のCOBOLで作られたシステムをオープン系に移行する時、配列をそのままテーブルに入れたい、って要望が多いです。
yubaさんが書かれたように配列は1列毎に分けると SQLでSUM, MAX, MINなどのグループ関数が使えるので便利ですよ、配列をコンマ区切りの文字列にするとコンマ毎に切り出す手間があるし、グループ関数も使えないからSQL以外にLOOPなどを使ったプログラムを作らなければならないので複雑になります、などと説明して納得していただいています。

投稿2016/12/12 03:22

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2016/12/12 22:22

ご説明ありがとうございます。 やはり配列をそのままテーブルに入れたいという声はあるのですね・・・。 まだ完成していないのですが、お教え頂いた内容を試しているところです。
guest

0

ベストアンサー

配列そのものを入れる、というよりもそれを文字列に変換して入れる、という形が一般的だと思います。
例えば、全ての要素をカンマで区切って入れるとか…
最終的にどの様にして、格納したデータを取り出して使いたいかを明確にするとよいと思います。

また、そもそもの設計として配列の要素数が不確定なのであれば、これをカラムに入れるよりも
DBにキーだけ登録して(TableA)、登録項目を1レコードずつ入れるテーブルを用意した方が良い気がしますね。

【例】
TableA : key => (配列を特定するキー)
TableB : key => (TableAと紐づくキー)
Sort => (取出したい順序)
Value => (配列の内容)

こんな感じの設計も良いのでは?

投稿2016/12/10 02:51

編集2016/12/10 02:55
motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2016/12/10 03:53

ご返信ありがとうございます。 お教え頂いた方法も含めてどうするか考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問