DB とユーザーの間を取り持つアプリは PHP ベースの Web アプリで実装します
入力フォームにおいて資格のような複数行の入力項目がありその行が可変である場合、DBはどのタイミングでどのように処理すればよいのでしょうか。
考えた方法はふたつです。
①資格の「行を追加」したときに一時テーブルに保存し「登録する」を押下したときに書き込みにいく方法です。最初の登録時は問題ないのですが、「編集」する際に削除や追加がされた場合どのタイミングでどのようなSQLを組みたてればよいかがわかりません。
②「登録する」を押下したときに、一度テーブルの中身を空にしてINSERT仕直す方法です。
※大量のDELETE/INSERTは避けたいのですが実現方法がわかりません。
よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
PHPで作成 Version 5.4.16
■メンバーテーブル
ID | 名前 | 電話番号 |
---|---|---|
1 | AAA | 09011112222 |
2 | BBB | 09033334444 |
■資格情報テーブル
資格ID | メンバーテーブル_ID | 資格名 | 取得日 |
---|---|---|---|
1 | 1 | 資格1 | 20200101 |
2 | 1 | 資格2 | 20200401 |
3 | 2 | 資格3 | 20210501 |
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/04 03:06
2022/01/04 03:08
退会済みユーザー
2022/01/04 03:24
退会済みユーザー
2022/01/04 03:26
退会済みユーザー
2022/01/04 03:54 編集
回答3件
0
ベストアンサー
各行にhiddenか何かで新規、編集、削除を判定するフラグを持てば、対象行のみに目的に応じた必要な処理が可能になるのでは。
(テキスト編集時、削除ボタン押下等で、JavaScriptでフラグ書き換え)
※ただこの画面の確定アクションが「登録する」だけなのか、削除、行追加でも都度DB編集までやってるのか等がわからないので、何が最適かは要件次第かと思います。
ちなみに「全行削除して作り変え」は排他制御できなくなるため、複数人アクセスがあり得るWebアプリでは通常はあり得ない方式です。(自分しか使わない事が確定しているアプリならいいですが、、)
排他制御についてよく知らないようでしたら、一度調べてみた方が良いと思います。
参考
投稿2022/01/04 04:47
総合スコア831
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/04 09:34 編集
2022/01/04 12:02
2022/01/05 09:45
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総合スコア508
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/04 10:27
2022/01/04 10:58
2022/01/04 11:18
2022/01/05 09:45
2022/01/05 09:46
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/04 04:36
退会済みユーザー
2022/01/04 05:07
2022/01/04 10:29 編集
退会済みユーザー
2022/01/04 13:56 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。