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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

データベース

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

Q&A

解決済

3回答

3888閲覧

入力フォームでの複数行の挿入・更新・削除について

pluto22

総合スコア9

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

データベース

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

0グッド

2クリップ

投稿2022/01/04 02:40

編集2022/01/04 09:16

DB とユーザーの間を取り持つアプリは PHP ベースの Web アプリで実装します

入力フォームにおいて資格のような複数行の入力項目がありその行が可変である場合、DBはどのタイミングでどのように処理すればよいのでしょうか。

考えた方法はふたつです。

①資格の「行を追加」したときに一時テーブルに保存し「登録する」を押下したときに書き込みにいく方法です。最初の登録時は問題ないのですが、「編集」する際に削除や追加がされた場合どのタイミングでどのようなSQLを組みたてればよいかがわかりません。

②「登録する」を押下したときに、一度テーブルの中身を空にしてINSERT仕直す方法です。
※大量のDELETE/INSERTは避けたいのですが実現方法がわかりません。

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

イメージ説明

補足情報(FW/ツールのバージョンなど)

PHPで作成 Version 5.4.16

■メンバーテーブル

ID名前電話番号
1AAA09011112222
2BBB09033334444

■資格情報テーブル

資格IDメンバーテーブル_ID資格名取得日
11資格120200101
21資格220200401
32資格320210501

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/04 02:59

DB とユーザーの間を取り持つアプリは何ですか? jQuery のタグが付いてますが jQuery ではできませんけど? ASP.NET とか PHP ベースの Web アプリ?
m.ts10806

2022/01/04 03:06

「アプリケーションの仕様なので決めてください」という回答となります。
pluto22

2022/01/04 03:08

PHPベースのWebアプリとなります。「行の追加」を押下した際一時テーブルに保存する処理をAjaxで実装しPHPでDBに書き込みにいくことを想定しました。
退会済みユーザー

退会済みユーザー

2022/01/04 03:24

> 「行の追加」を押下した際一時テーブルに保存する処理をAjaxで実装 なぜ一時テーブルに保存する必要があるのですか? なぜ Ajax で実装なのですか? 分かって書いてるとは思えませんけど。 PHP は知りませんけど、ASP.NET Web Forms アプリには質問のことができるフレームワークが備わってます。一時テーブルとかは使いませんし、Ajax も使いません。
退会済みユーザー

退会済みユーザー

2022/01/04 03:26

DB とユーザーの間を取り持つアプリは PHP ベースの Web アプリであることを質問欄を編集して追記してください。PHP のタグもつけてください。
退会済みユーザー

退会済みユーザー

2022/01/04 03:54 編集

「DB とユーザーの間を取り持つアプリは PHP ベースの Web アプリである」ことを質問欄を編集して質問の上の方に追記してください。「PHPで作成」と下の方に見えないぐらい小さく書くだけでは説明不足です。
guest

回答3

0

ベストアンサー

各行にhiddenか何かで新規、編集、削除を判定するフラグを持てば、対象行のみに目的に応じた必要な処理が可能になるのでは。
(テキスト編集時、削除ボタン押下等で、JavaScriptでフラグ書き換え)

※ただこの画面の確定アクションが「登録する」だけなのか、削除、行追加でも都度DB編集までやってるのか等がわからないので、何が最適かは要件次第かと思います。

ちなみに「全行削除して作り変え」は排他制御できなくなるため、複数人アクセスがあり得るWebアプリでは通常はあり得ない方式です。(自分しか使わない事が確定しているアプリならいいですが、、)

排他制御についてよく知らないようでしたら、一度調べてみた方が良いと思います。
参考

投稿2022/01/04 04:47

umau

総合スコア831

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

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

pluto22

2022/01/04 09:34 編集

ご回答いただきありがとうございます。 >>「全行削除して作り変え」は排他制御できなくなるため、複数人アクセスがあり得るWebアプリでは通常はあり得ない方式です 理解いたしました。 >>ただこの画面の確定アクションが「登録する」だけなのか、削除、行追加でも都度DB編集までやってるのか等がわからないので、何が最適かは要件次第かと思います。 あわせてテーブルの設計をいたしました。 中間テーブル(資格情報テーブル)をどのタイミングで更新・削除するのがよいのかよくわかっておりません。 登録ボタンを押下したときに差分をとって更新・削除または挿入するのがいいのか、行の追加のときに挿入するのがいいのか(その場合確定でないときはどうするのか)をタイミングは要件次第ということでしょうか。 >>各行にhiddenか何かで新規、編集、削除を判定するフラグを持てば 「登録する」ボタンを押下したときに処理する方法がいいでしょうか。一度実装してみます。
umau

2022/01/04 12:02

「タイミング」の意味を少し測りかねていたんですが、要するにこちらが言った 「確定アクションが「登録する」だけなのか、削除、行追加でも都度DB編集までやってるのか」 という、これがそのまま「それを普通はどうするものかが知りたい事」ということでしょうか。 普通はこの画面くらいなら「登録する」ボタンの一発ドンでまとめて登録更新してしまうものじゃないでしょうか。細かくDBに反映して、中途半端な状態を頑張って管理しても嬉しい事はあまりないと思います。 ただもちろん要件によります。例えば編集項目が大量で全項目入力するのに何十分もかかるような画面なら、作業中の内容を一時テーブルに残し、作業中断できる機能等も必要な場合はあると思います。 メンバーテーブルの電話番号と資格情報テーブルの両方を1トランザクションで一発更新、が僕の感覚的には自然だと思います。(質問の意図と違ったらすみません。)
pluto22

2022/01/05 09:45

ご回答ありがとうございます。 >>これがそのまま「それを普通はどうするものかが知りたい事」ということでしょうか。 はい。拙い文章で申し訳ございません。 「全行削除して作り変え」はあり得ないとわかりましたのでsrsnsts様がご提示くださったようにユーザー側で処理区分を選択してもらう方法も確認したいと思います。 仰る通り普通はどうするのか知りたいです。 >>メンバーテーブルの電話番号と資格情報テーブルの両方を1トランザクションで一発更新 ありがとうございます。この方法でやってみます。
guest

0

こんばんわ。

htmlやphpの実装が示されていないので意見が難しい部分はあるのですけれども、

html側で要素を配列で持っておき、php側ではループを回してSQLを処理するのではダメなのですか?

個人が所有する資格の数なんて、多くて10〜20件レベルだと思うので、

ループを回して都度INSERT文を発行する方式にしても、それほど負荷が高くないと思いますが、いかがですか?

以下のhtmlは私の考え方を示す一例です。

コメントを受けて処理区分を設けました。

html

1<html> 2<head> 3 <!-- jQueryを使う --> 4 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> 5 <script> 6 // 7 // "登録する"ボタンを押下した際の処理 8 // 9 $("#btn_submit").on("click", function(event){ 10 let i; 11 12 // 13 // syori_kbn に関する内容を追加 14 // 15 // 'syori_kbn' というnameの要素のリストを取得する 16 let syori_kbn_elems = document.getElementsByName('syori_kbn'); 17 let syori_kbn = []; 18 for(i=0;i<syori_kbn_elems.length;i++){ 19 // 配列 syori_kbn に値を詰める 20 syori_kbn[i] = syori_kbn_elems[i].value; 21 } 22 23 // 'shikakumei' というnameの要素のリストを取得する 24 let shikakumei_elems = document.getElementsByName('shikakumei'); 25 let shikakumei = []; 26 for(i=0;i<shikakumei_elems.length;i++){ 27 // 配列 shikakumei に値を詰める 28 shikakumei[i] = shikakumei_elems[i].value; 29 } 30 31 // 'category' というnameの要素のリストを取得する 32 let category_elems = document.getElementsByName('category'); 33 let category = []; 34 for(i=0;i<category_elems.length;i++){ 35 // 配列 category に値を詰める 36 category[i] = category_elems[i].value; 37 } 38 39 // 'syutoku_ymd' というnameの要素のリストを取得する 40 let syutoku_ymd_elems=document.getElementsByName('syutoku_ymd'); 41 let syutoku_ymd = []; 42 for(i=0;i<syutoku_ymd_elems.length;i++){ 43 // 配列 syutoku_ymd に値を詰める 44 syutoku_ymd[i] = syutoku_ymd_elems[i].value; 45 } 46 47 // 48 // ajax で syori.php にポストします 49 // syori.phpにデータを送信し、SQL文を発行します 50 // 51 $.ajax({ 52 type: "POST", 53 url: "syori.php", 54 data: { 55 "syori_kbn" : syori_kbn, 56 "sikakumei" : shikakumei, 57 "category" : category, 58 "syutoku_ymd" : syutoku_ymd 59 }, 60 dataType : "json" 61 }).done(function(ret){ 62 // 63 // php側で処理が正常に終了すると、 64 // ここの部分が実行される。 65 // 「登録成功」などの文言を表示するのが妥当か。 66 // 67 }).fail(function(XMLHttpRequest, status, e){ 68 alert(e); 69 }); 70 }); 71 }); 72 </script> 73</head> 74<body> 75<form name='records'> 76<table> 77<tr> 78 <th>処理区分</th> 79 <th>資格名</th> 80 <th>カテゴリ</th> 81 <th>取得日</th> 82</tr> 83<tr> 84 <td> 85 <select name="syori_kbn"> 86 <option value="N">変更なし</option> 87 <option value="U">更新</option> 88 <option value="D">削除</option> 89 <option value="I">追加</option> 90 </select> 91 </td> 92 <td><input type='text' name='shikakumei' /></td> 93 <td><input type='text' name='category' /></td> 94 <td><input type='text' name='syutoku_ymd' /></td> 95</tr> 96<tr> 97 <td> 98 <select name="syori_kbn"> 99 <option value="N">変更なし</option> 100 <option value="U">更新</option> 101 <option value="D">削除</option> 102 <option value="I">追加</option> 103 </select> 104 </td> 105 <td><input type='text' name='shikakumei' /></td> 106 <td><input type='text' name='category' /></td> 107 <td><input type='text' name='syutoku_ymd' /></td> 108</tr> 109</table> 110<input type="button" id="btn_submit" value="登録する" /> 111</form> 112</body> 113</html>

php側の一例を以下に示します。

コメントを受けて処理区分を追加しました。

PHP

1<?php 2// 3// syori.php 4// 5 6// 7// postされたデータを配列形式で受け取る 8// 提示されたバージョンで動作するかは不明 9// 10 11// syori_kbn に関する内容を追加 12$syori_kbn = filter_input(INPUT_POST,'syori_kbn',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 13$shikakumei = filter_input(INPUT_POST,'shikakumei',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 14$category = filter_input(INPUT_POST,'category',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 15$syutoku_ymd = filter_input(INPUT_POST,'syutoku_ymd',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 16 17// 18// レコード数だけSQL文を発行する 19// $syori_kbn[$i]が 20// "N" なら何も処理しない 21// "U" ならUPDATEする 22// "D" ならDELETEする 23// "I" ならINSERTする 24// 25for($i=0;$i<count($syori_kbn);$i++){ 26 if($syori_kbn[$i] === 'N'){ 27 28 // 何もしない 29 continue; 30 31 }elseif($syori_kbn[$i] === 'U'){ 32 33 // UPDATEを実行 34 35 }elseif($syori_kbn[$i] === 'D'){ 36 37 // DELETEを実行 38 39 }elseif($syori_kbn[$i] === 'I'){ 40 41 // INSERTを実行 42 } 43} 44

こんな感じでどうですか?

投稿2022/01/04 09:48

編集2022/01/04 11:16
srsnsts

総合スコア508

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

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

pluto22

2022/01/04 10:27

ご回答いただきありがとうございます。 >>html側で要素を配列で持っておき、php側ではループを回してSQLを処理するのではダメなのですか? 初回の登録時(INSERT)はご提示いただいた方法でなにも問題ございません。 編集の際の処理について資格2を変更、資格3を削除、資格4を追加する場合もあるなどそのあたりの差分の取り方とタイミングと処理方法がよくわからなかった次第です。 例) 資格1[変更なし] 資格2[変更あり] 資格3[削除] 資格4[追加] ※工夫してできるかもしれないのですが、一般的なやり方?はあるのでしょうか。 ご教授いただけましたら幸いです。
srsnsts

2022/01/04 10:58

お返事ありがとうございます。 更新するレコード、削除するレコードそして追加するレコードが何かわかっているのは操作している ユーザーなわけですから、処理区分(やり方はセレクトボックスでもよいし、テキストボックスでも良い、 まぁセレクトボックスがわかりやすいか)を設けてレコードごとに指定させるのが良いと思います。 回答に上記内容を反映させます。しばらくお待ち下さい。
srsnsts

2022/01/04 11:18

処理区分を追加した回答をUPしました。 ご確認下さい。
pluto22

2022/01/05 09:45

ご回答ありがとうございます。 またコードをご提示いただきありがとうございます。感謝いたします! ※filter_input(PHP 5 >= 5.2.0, PHP 7, PHP 8)が自分の環境では動作しませんでしたが変更し動作確認できました。
srsnsts

2022/01/05 09:46

良かったですね。
guest

0

入力フォームにおいて資格のような複数行の入力項目がありその行が可変である場合、DBはどのタイミングでどのように処理すればよいのでしょうか。

PHP ベースの Web アプリだそうですが、であればフレームワークに備わっている機能を探してそれを使うことを検討してはいかがですか?

Web アプリはステートレスなので一度に複数の行を挿入・更新・削除するのは無理があり、そのあたりをうまく考えたフレームワークがあるのではと思います。

PHP は分かりませんが、例えば ASP.NET Web Forms アプリには SqlDataSource, ListView などのサーバーコントロールがライブラリとして用意されており、Visual Studio でそれらのサーバーコントロールを使ってアプリを作れば、プログラマは一行もコードを書かなくても以下の画像ようなアプリを作ることができます。

イメージ説明

挿入は上の画像の赤枠のテキストボックスにデータを入力し、[挿入]ボタンをクリックすれば入力したデータが DB に INSERT されます。

削除は削除したい当該レコードの行の[削除]ボタンをクリックするだけです。

更新は更新したい当該レコードの行の[編集]ボタンをクリックすると、下の画像の赤枠のように既存のデータを編集できるようになるので、編集操作後に[更新]ボタンをクリックすれば DB の当該レコードは UPDATE されます。

イメージ説明

上記の操作に「一時テーブルに保存」とか「Ajax で実装」というのはありません。

別の例では MVC での CRUD 操作の実装があります。下が一覧画面の表示です。挿入・更新・削除はその画面の Create New とか Edit からリンクが張ってある別画面に遷移して行います。

イメージ説明

挿入の場合

イメージ説明

更新の場合

イメージ説明

上の操作にも「一時テーブルに保存」とか「Ajax で実装」というのはありません。

投稿2022/01/04 04:14

編集2022/01/04 04:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2022/01/04 04:36

PHPのフレームワークを全て知ってるわけではないですが、.netのようにUIのフォームとデータが結びつくほどのものはなかったと思います。
退会済みユーザー

退会済みユーザー

2022/01/04 05:07

> .netのようにUIのフォームとデータが結びつくほどのものはなかったと思います。 そうですか・・・ でも、Web アプリで、自力で、スクラッチで、一からコードを書いて質問に書いてある「複数行の挿入・更新・削除」ができるようにするのは、ここのような Q&A サイトでいくら情報を仕入れても無理なので、フレームワークが無ければ信頼できる先人が作ったコード例などを探してもらう他ないと思います。
pluto22

2022/01/04 10:29 編集

ご回答いただきありがとうございます。 今回フレームワーク自体は都合により利用できかねますが仕組みや機能について勉強いたします。 後だしで大変申し訳ございませんがテーブルの設計をいたしました。 >>上記の操作に「一時テーブルに保存」とか「Ajax で実装」というのはありません。 承知いたしました。 中間テーブルに登録するタイミングがわからなかったので一旦一時テーブルに保存という発想にいたりましたができないということで理解いたしました。
退会済みユーザー

退会済みユーザー

2022/01/04 13:56 編集

> 今回フレームワーク自体は都合により利用できかねますが仕組みや機能について勉強いたします。 まともな考えだとは思えませんね。なぜなら質問文から判断するとあなたには自力で実装できるスキルは無いと思わざるを得ないから。セキュリティの問題とかも考えてみて。自力で何とかするのは 100% 無理と思いますが、1 年ぐらい精進すれば何とかなるかも。頑張ってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問