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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

4回答

3219閲覧

DBの同じカラム直下に複数のレコードをinsertさせるには

leoairen

総合スコア122

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/06/25 05:49

編集2016/06/25 07:14

初心者です。
DBの同じカラム直下に複数のレコードをinsertさせるにはどうすればよいかどなたか教えて頂けますでしょうか。

以下は入力フォームで入力した複数の日付を確認画面で受け取ったものです。

<th>休日年月日</th> <td>2016/9/12,2016/9/14,2016/9/20,2016/9/26,2016/9/28</td> </table>

日付が一つでしたらinsertは可能ですが、複数の場合はinsertできませんでした。

一行の場合、

「$sql = "insert into calendartbl (holiday) values ('ポストされた値')";」

複数でinsertした場合のDBのイメージは以下の通りです。

holiday(カラム名)
2016/9/12(レコード1行目)
2016/9/14(レコード2行目)
2016/9/20(レコード3行目)
2016/9/26(レコード4行目)
2016/9/28(レコード5行目)

どなたか教えて頂けたら幸いです。

よろしくお願い致します。

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

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

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

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

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

leoairen

2016/06/25 07:01

ご指摘、ありがとうございます。試行錯誤と検索の結果、わからなかったので質問させていただいたのですが...。単数の時はわかりますので、複数の場合のやり方を伺いたかったのです。また、URL先は拝見しましたが、初心者なので、わからないときの質問の仕方は難しいです。もし模範の質問の仕方などありましたらぜひご教授願いたいです。よろしくお願い致します。
KiyoshiMotoki

2016/06/25 07:08

「日付が一つでしたらinsertは可能」なのであれば、そのソースコードを質問欄に追記してください。
leoairen

2016/06/25 07:16

ご指摘、ありがとうございます。質問のほうは修正いたしました。マルチポストに関しては各掲示板に回答や返事してあればマナー違反まではならないと書いてありましたが、気を付けます。
KiyoshiMotoki

2016/06/25 07:31

情報の追記、ありがとうございます。しかし、重要なのは「入力フォームで入力した複数の日付」を受け取ってから、追記いただいたSQL文を実行しているまでのPHPコードの方です。その部分がわからないと、抽象的な言葉でしか解決策を提案できません。
guest

回答4

0

ベストアンサー

基本INSERTで登録できるのは1レコードです。
この場合でしたらINSERTを5回実行するのが最適と思います。
INSERTとSELECTを組み合わせて1回のクエリで済ますこともできると思いますが、コードで書いた時の作りにくさや可読性を考えるとお勧めしません。

投稿2016/06/27 01:25

ttyp03

総合スコア16996

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

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

leoairen

2016/06/27 05:40

ご回答、ありがとうございます。 では、DBに新たに日付を追加するたびにinsertを手動で一回追加することになりますでしょうか。 変数などでDBに値が入るたびにinsertを実行するような書き方はありませんでしょうか。
ttyp03

2016/06/27 05:47

ポストされた値をカンマでexplodeして配列に格納して、その要素分ループで回せば良いでしょう。 $d = explode(",",(ポストされた値)); foreach( $d as $key => $value ){ $sql = "into calendartbl (holiday) values ('" . $value . "')"; クエリ発行 } みたいな感じです。
leoairen

2016/06/27 07:07

ご回答、ありがとうございます。 教えて頂いた方法でできました。 ただし、DBに登録してある日付と同じ場合はinsertしないようにするにはどのように書けばよろしいでしょうか。foreachの上に$value != $value 的な感じでしょうか。
leoairen

2016/06/27 07:55

早速のご回答、ありがとうございます。 リファレンス大変助かりました。 「ON DUPLICATE KEY UPDATE cnt = cnt + 1」のほうを使いましたら重複したものは登録されなくなりました。しかし、その代わりに新規登録もできなくなりました。 IGNOREとREPLACEは同じ日付が登録できてしまいます。 削除フラグを制御したく、テーブルを以下のとうに構成しました。 たとえば、2016-08-08を二つ登録したときに、holiday_noは異なりますが、もしかしたらそれでぶつかったということでしょうか。 `holiday_no` int(11) NOT NULL AUTO_INCREMENT COMMENT '休日No', `holiday` date NOT NULL DEFAULT '0000-00-00' COMMENT '休日年月日', `is_deleted` char(1) NOT NULL COMMENT '削除フラグ(y, n)',
ttyp03

2016/06/27 08:02

キーは何になっているのですか? 恐らくholiday_noでしょうか。 だとすると AUTO_INCREMENT がついているので、基本的にはINSERTでエラーにならないですね。 テーブルレイアウトとしては、holiday_noカラムは削除して、holidayカラムをキーにすれば良いと思います。 あとINSERTのオプションはIGNOREでいいんじゃないでしょうか。
leoairen

2016/06/28 00:54

早速のご回答、ありがとうございます。 holiday_noでしたので、holidayカラムに変更しました。 DB側でプライマリキーに設定しましたら重複登録がなくなったので、この場合はIGNOREの設定は必要でしょうか。
ttyp03

2016/06/28 00:57

IGNOREがないとエラーになりませんか? 一応やっておいた方が無難だと思います。
leoairen

2016/06/28 01:23 編集

エラーログで見た場合はエラーがありませんでしたが、IGNOREをつけておきます。holiday_noを外しましたら、一番最初に登録した日付が反映されないことに気づきました。たとえば、2016/9/12(レコード1行目) 、 2016/9/14(レコード2行目) 、2016/9/20(レコード3行目)をDBに登録したとき、2016/9/12が反映されないことになります。この場合はどのように修正すればよろしいでしょうか。
ttyp03

2016/06/28 01:31

なぜ反映されないことになるのですか? INSERTのループで1件目は処理されていますか?
leoairen

2016/06/28 02:00 編集

失礼しました。DBのほうにはきちんと反映されますが、そのDBにある一行目のレコードの日付がカレンダーに反映されないということです。 昨日教えて頂いた「if(array_search(sprintf("%4d-%02d-%02d",$y,$m,$d), $holiday)){」の$holidayの中にはきちんと配列として一番最初のレコードを取得しておりますが、カレンダーには反映されないことになっています。
ttyp03

2016/06/28 02:03

こちらの質問の続きになってしまいますね。 https://teratail.com/questions/39121 $holiday配列にきちんと取り込めていれば問題ないと思うのですが。 このままここで続けると当初の質問とかけ離れてしまうので、INSERTの問題が解決したのならこの質問は締めて、改めて質問をした方がよいと思います。
leoairen

2016/06/28 02:26

ありがとうございます。そう致します。
guest

0

挿入したい箇所にidのみを登録し、新たにそのidをキーにしたtableを作成することで実現します。

投稿2016/06/25 06:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

leoairen

2016/06/25 06:26

ご回答、ありがとうございます。どのように記述すればよいか教えて頂けますでしょうか。 一行の場合、 「$sql = "insert into calendartbl (holiday) values ('ポストされた値')";」でできますが、例など教えて頂けたら幸いです。
退会済みユーザー

退会済みユーザー

2016/06/25 06:45

質問箇所が明確で無いので、回答しにくいですが、既存の table(calendartbl?) の特定のカラムに適当な id を insert します。 次に新しい table を作り、先ほど特定カラムに挿入した id と並列したい値をセットで挿入します。 挿入の仕方が不明な場合は新しく質問を立てるか、過去の質問を検索して下さい。
leoairen

2016/06/27 07:08

ご回答、ありがとうございます。ttyp03さんの方法でできました。ありがとうございます。
guest

0

日付が一つでしたらinsertは可能ですが、複数の場合はinsertできませんでした。

5レコード作りたいならば、5回に分けてインサートしてください。

投稿2016/06/25 06:04

azurite2016

総合スコア69

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

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

leoairen

2016/06/25 06:27

ご回答、ありがとうございます。どのように記述すればよいか教えて頂けますでしょうか。 一行の場合、 「$sql = "insert into calendartbl (holiday) values ('ポストされた値')";」でできますが、5回となるとこの文を5回書くということでしょうか?
azurite2016

2016/06/25 06:30

自分で書くなら、 1. POSTされた値をカンマ区切りで配列に分割 2.配列の数だけループしつつ $sql = "insert into calendartbl (holiday) values (配列[添字])"; をまわしていれますね。
leoairen

2016/06/27 07:13

ご回答、ありがとうございます。ttyp03さんの方法でできました。おそらく、azurite2016さんも同じような方法を教えてくださったかと思いますが、explodeの概念やループの回し方に理解がまだでしたので、書けませんでした。
guest

0

普通は、入れられません。

データを正規化することによって、検索したり並べ替えたりを素早く行おうという目的で使うのがデータベースだからです。
どのデータベースでも可能な方法で考えるとすると

・上限が決まってて数が少ないなら列を増やす。
・数が未定なら正規化して別のテーブルに入れる

のどちらかになると思います。

データベース特有の機能でもOKということであれば、PostgreSQLというデータベースなら配列型というのが使えるので、希望した処理ができるでしょう。

参考URL
https://www.postgresql.jp/document/9.1/html/arrays.html

他に出来るデータベースがあるのかも知れませんが私の知る限りでは、PostgreSQLだけです。

投稿2016/06/25 06:01

Mr_Roboto

総合スコア2208

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

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

leoairen

2016/06/25 06:29

ご回答、ありがとうございます。 一行の場合、 「$sql = "insert into calendartbl (holiday) values ('ポストされた値')";」でできますが、複数は無理ということでしょうか。
Mr_Roboto

2016/06/25 06:37

> DBの同じカラム直下 というのが、1レコードという意味なら出来無いです。 レコードが分かれてもいいのであれば、他の方の回答にもあるように5回Insertを行いましょう。
leoairen

2016/06/25 07:02

ご回答、ありがとうございます。試してみます。
leoairen

2016/06/27 07:14

ご回答、ありがとうございます。ttyp03さんの方法でできました。ありがとうございます。
Mr_Roboto

2016/06/27 07:19

良かったですね 早く質問の最初に初心者ですとつけなくて良くなるといいですね ^^
leoairen

2016/06/27 07:27

ありがとうございます。 自分もいつか答える側に成長していきたいです。 がんばります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問