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

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

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

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

Q&A

1回答

1073閲覧

入力フォームからデータベースを一括更新する方法について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/02/21 00:39

編集2020/02/21 02:12

XAMPPのPHP7とMySQL(mariaDB10.3.15)を使用しています。

データベースに登録してあるデータの中の『お弁当の発注数』を一括更新するためのテーブル&入力フォームを作成しています。

現在、下記コードにて「連続入力できるフォーム」は作ることができたのですが、これを受け取って一括更新するにはどうしたら良いでしょうか。

'vn01str'が一致するレコードごと'vn10str'と'vn11str'を順番に更新していくのか、あるいは、'vn01str'の一致・不一致に関わらず'vn10str'と'vn11str'のみ連続で更新していくことが可能か、教えていただけますでしょうか。

お手数おかけいたしますが、よろしくお願い致します。

php

1<?php 2 3 try { 4 5 6 $pdo = new PDO('mysql:host=localhost;dbname=general_works', 'root', ''); 7 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 8 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 9 10 11 } catch (PDOException $msg) { 12 13 header('content-type: text/plain'); 14 die("データベース接続に失敗しました。: " . $msg->getMessage() . "\n"); 15 16 } 17 18 try{ 19 $sql = "SELECT * FROM vtw100n"; 20 $stmh = $pdo->prepare($sql); 21 $stmh->execute(); 22 23 } catch(PDOException $Exception){ 24 25 die('接続エラー:' .$Exception->getMessage()); 26 27 } 28?> 29 30 31 32 33 34<!DOCTYPE html> 35<html> 36<head> 37<meta charset="UTF-8"> 38<title>お弁当の発注個数登録</title> 39<link rel="stylesheet" href="../css/style.css" /> 40 41<!-- jQuery --> 42<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 43 44<!-- jQuery blockUI.js --> 45<script src="../js/jquery.blockUI.js"></script> 46<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script> 47<script> 48<!-- 49$(function(){ 50 $('#waiting').click(function(){ 51 $.blockUI({ 52 message: '<h1 style="font-size:0.6rem; font-weight:normal;"><img src="../img/ajax-loader_w.gif" /> ただいま登録中です...しばらくお待ち下さい。</h1>', 53 fadeIn: 200, 54 fadeOut: 0, 55 56 overlayCSS: { 57 backgroundColor: '#000', 58 color: '#fff', 59 opacity: '0.6', 60 cursor: 'wait' 61 }, 62 css: { 63 border: 'none', 64 backgroundColor: '#079', 65 color: '#fff', 66 padding: '1rem', 67 margin: '0', 68 height: '2rem', 69 width: '16rem', 70 verticalAlign: 'middle' 71 } 72 }); 73 }); 74}); 75--> 76</script> 77 78</head> 79 80<body bgcolor="#f6fcf9"> 81 82<div class="innerG clearfix"> 83 84<div style="padding:1rem 1rem 3rem 1rem;"> 85 86<form action="./restore.php" method="POST"> 87 88<table class="personTable"> 89 <thead> 90 <tr style="border:1px solid #333;"> 91 <th style="border:1px solid #333;">社員番号</th> 92 <th style="border:1px solid #333;">氏   名</th> 93 <th style="border:1px solid #333;">お 弁 当</th> 94 <th style="border:1px solid #333;">おかずのみ</th> 95 </tr> 96 </thead> 97 <tbody> 98 99<?php 100 101 while($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 102 103?> 104<tr> 105 <td class="tdLine"><?=htmlspecialchars($row['vn01str'])?></td> 106 <td class="tdLine"><?=htmlspecialchars($row['vn02str'])?></td> 107 <td class="tdLine inputText"><input type="text" name="lunch01" VALUE="<?=htmlspecialchars($row['vn10str'])?>" /></td> 108 <td class="tdLine inputText"><input type="text" name="lunch02" VALUE="<?=htmlspecialchars($row['vn11str'])?>" /></td> 109</tr> 110 111<?php 112 } 113 $pdo = null; 114?> 115 116 117 </tbody> 118 </table> 119<input type="submit" value="お弁当の発注情報を登録・更新する" id="waiting"> 120 121</form> 122 123</div> 124 125</div><!--- /innerG ---> 126 127 128</body> 129</html>

追記

このフォームから入力するのは、『月間』の通常弁当とおかずのみの『注文数』を入力し、上記コードのフォームの入力値を、もともとのテーブル'timeworks'に反映させるものが作りたいと思っています。

また、現状のデータベースの状態を、以下の通り、お知らせ致します。

MySQL

1-- -------------------------------------------------------- 2 3-- 4-- テーブルの構造 `timeworks` 5 6CREATE TABLE `timeworks` ( 7 `01str` int(1) DEFAULT 0 COMMENT '固定文字00', 8 `02str` int(6) DEFAULT NULL COMMENT '処理年月', 9 `03str` int(8) ZEROFILL DEFAULT NULL COMMENT '個人コード', 10 `04str` varchar(20) DEFAULT NULL COMMENT '氏名', 11 `05str` varchar(10) DEFAULT NULL COMMENT '集計区分', 12 `06str` float DEFAULT 0 COMMENT '出勤日数', 13 `07str` int(2) DEFAULT 0 COMMENT '休出1日数', 14 `08str` int(2) DEFAULT 0 COMMENT '休出2日数', 15 `09str` time DEFAULT NULL COMMENT '出勤率分子', 16 `10str` time DEFAULT NULL COMMENT '遅早時間', 17 `11str` time DEFAULT NULL COMMENT '私用外出', 18 `12str` float DEFAULT 0 COMMENT '有給消化', 19 `13str` float DEFAULT 0 COMMENT '慶弔日数', 20 `14str` float DEFAULT 0 COMMENT '振休日数', 21 `15str` float DEFAULT 0 COMMENT '産休日数', 22 `16str` float DEFAULT 0 COMMENT '特休日数', 23 `17str` float DEFAULT 0 COMMENT '帰休日数', 24 `18str` float DEFAULT 0 COMMENT '教育日数', 25 `19str` float DEFAULT 0 COMMENT '休職日数', 26 `20str` float DEFAULT 0 COMMENT '弁当個数', 27 `21str` int(1) DEFAULT 0 COMMENT '固定文字01', 28 `22str` time DEFAULT NULL COMMENT '時間外合計', 29 `23str` float DEFAULT 0 COMMENT '欠勤日数', 30 `24str` float DEFAULT 0 COMMENT '欠勤日数', 31 `25str` time DEFAULT NULL COMMENT '遅早外時間', 32 `26str` time DEFAULT NULL COMMENT '通常残業', 33 `27str` time DEFAULT NULL COMMENT '深夜残業', 34 `28str` time DEFAULT NULL COMMENT '深夜所定', 35 `29str` time DEFAULT NULL COMMENT '休1時間', 36 `30str` time DEFAULT NULL COMMENT '休1深夜', 37 `31str` time DEFAULT NULL COMMENT '休2時間', 38 `32str` time DEFAULT NULL COMMENT '休2深夜', 39 `33str` time DEFAULT NULL COMMENT '休出1代出', 40 `34str` time DEFAULT NULL COMMENT '休出1代深', 41 `35str` time DEFAULT NULL COMMENT '休出2代出', 42 `36str` int(2) DEFAULT 0 COMMENT 'おかずのみ注文' 43 44) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

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

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

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

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

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

yambejp

2020/02/21 01:04

社員番号ごとに、お弁当の種類とおかずのみかどうかを手で書くのですか? おかずのみはチェックボックスじゃなくてよい?
退会済みユーザー

退会済みユーザー

2020/02/21 01:39

この件について、本文に追記しました。 この入力フォームを利用して『月間の注文数』を入力するためなので、チェックボックスではなく『入力数』で大丈夫です。データ型はINT(2)にしています。
yambejp

2020/02/21 01:40

調整して回答してあります
guest

回答1

0

こんな感じの受け渡しにすればよいでしょう

投稿2020/02/21 01:16

yambejp

総合スコア116835

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

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

yambejp

2020/02/21 01:39 編集

弁当とおかずの数量をいれるのですね・・ <?PHP print_r($_POST); ?> <form method="post"> <table> <thead> <tr> <th>社員番号</th> <th>氏名</th> <th>お弁当</th> <th>おかずのみ</th> </tr> </thead> <tbody> <tr> <td>9</td> <td>亀井</td> <td><input type="text" name="bento[9]" VALUE=""></td> <td><input type="text" name="okazu[9]" VALUE=""></td> </tr> <tr> <td>6</td> <td>坂本</td> <td><input type="text" name="bento[6]" VALUE=""></td> <td><input type="text" name="okazu[6]" VALUE=""></td> </tr> <tr> <td>8</td> <td>丸</td> <td><input type="text" name="bento[8]" VALUE=""></td> <td><input type="text" name="okazu[8]" VALUE=""></td> </tr> <td>25</td> <td>岡本</td> <td><input type="text" name="bento[25]" VALUE=""></td> <td><input type="text" name="okazu[25]" VALUE=""></td> </tr> </tbody> </table> <input type="submit" value="お弁当の発注情報を登録・更新する" id="waiting"> </form>
退会済みユーザー

退会済みユーザー

2020/02/21 01:47

私の説明不足で申し訳ありません。多分このコードでは、当方が記述したコードと同じく『リストによる入力フォーム』が表示されるだけで、データベースを更新するものでは無いようです。 当方としては、このような入力フォームを使用してデータベースを一括更新するための方法がわからずにいます。 一行(社員)ごとに更新するのであれば、一行ごとにFORMで囲って送信すればできなくはないのですが、300件程度ある入力を、そのたびに更新するというのも大変なので、一括送信・一括登録したいのが希望です。
yambejp

2020/02/21 02:11

> 『リストによる入力フォーム』が表示されるだけ 全部書かないとわからないということですか? 受け取ったデータを利用してupdate文を実行すれば済む話なのですが・・・
退会済みユーザー

退会済みユーザー

2020/02/21 07:57 編集

> yambejp 様 誠に申し訳ありません。おっしゃるとおり「全部書かないとわからない」側の人間です。 「これ以上は自分でなんとかして」とおっしゃるのなら、この質問を取り下げます。 これを見て分かったのは、社員番号を入れ子?にした変数BENTOに、POSTした入力値を代入する?ということでしょうか。 これを用いた時、表示されたこの入力フォームを、どうやって一括でデータベースをUPDATEすればいいのか。
yambejp

2020/02/21 08:41 編集

ガッツリ書くので頑張って理解してください
yambejp

2020/02/21 08:42

<?PHP $x=filter_input(INPUT_POST,"x"); $bento=filter_input(INPUT_POST,"bento",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); $okazu=filter_input(INPUT_POST,"okazu",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); try { $dsn = 'mysql:host=localhost; dbname=general_works;charset=utf8;'; $user = 'root'; $password = ''; $pdo = new PDO($dsn, $user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $msg) { die("データベース接続に失敗しました。: " . $msg->getMessage() . "\n"); } if($x){ $keys_bento=array_keys($bento); $keys_okazu=array_keys($okazu); try { $sql ="UPDATE vtw100n set "; $set =""; $data=[]; if(count($bento)>0){ if($set!=="") $set.=","; $fill=implode(",",array_fill(0,count($bento),"?")); $set.="vn10str=COALESCE(ELT(FIELD(vn01str,{$fill}),{$fill}),vn10str)"; $data=array_merge($data,$keys_bento,$bento); } if(count($okazu)>0){ if($set!=="") $set.=","; $fill=implode(",",array_fill(0,count($okazu),"?")); $set.="vn11str=COALESCE(ELT(FIELD(vn01str,{$fill}),{$fill}),vn11str)"; $data=array_merge($data,$keys_okazu,$okazu); } $sql.=$set; $stmt = $pdo->prepare($sql); $stmt->execute($data); } catch (PDOException $msg) { die($msg->getMessage()); } } //つづく
yambejp

2020/02/21 08:43

try { $sql ="select * from vtw100n "; $stmt=$pdo->query($sql); $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $msg) { die($msg->getMessage()); } function h($str){ return htmlspecialchars($str); } ?> <form method="post"> <table> <thead> <tr> <th>社員番号</th> <th>氏名</th> <th>お弁当</th> <th>おかずのみ</th> </tr> </thead> <tbody> <?PHP foreach($rows as $row){ print "<tr>\n"; print "<td>".h($row["vn01str"])."</td>\n"; print "<td>".h($row["vn02str"])."</td>\n"; print "<td><input type=\"text\" name=\"bento[".h($row["vn01str"])."]\" VALUE=\"".h($row["vn10str"])."\"></td>\n"; print "<td><input type=\"text\" name=\"okazu[".h($row["vn01str"])."]\" VALUE=\"".h($row["vn11str"])."\"></td>\n"; print "</tr>\n"; } ?> </tbody> </table> <input type="submit" value="お弁当の発注情報を登録・更新する" id="waiting" name="x"> </form>
退会済みユーザー

退会済みユーザー

2020/02/24 01:17

お手数おかけ致しまして、誠に申し訳ありませんでした。 私のケアレスミスですが、最初に示させていただいたコードは、データベースのTABLEではなくVIEWを元に記述したコードでした。 そのため、データベースの登録ができませんでした。 改めて、書き換えが必要だった箇所を書き換えて、再度チャレンジしました。 vtw100n = timeworks; vn01str = 03str; vn02str = 04str; vn10str = 20str; vn11str = 36str; すると、入力フォームは問題なかったのですが、データベースを更新しようとすると「[HY093]: Invalid parameter number: number of bound variables does not match number of tokens」と表示され、更新されることはありませんでした。 ここまでやっていただいているのに、これ以上はお願いできないと思いますが、もし可能であれば、引き続きご面倒をお願いできますでしょうか。 当方でもいろいろググって勉強しながら、途中報告を順次コメントにて残そうと思います。 よろしくお願い致します。
退会済みユーザー

退会済みユーザー

2020/02/25 00:07

もしかして、データを更新するテーブル”timeworks”は、01strから36strまであるのに、UPDATEしようとしているのに20strと36strしかデータを投げようとしていないことが原因なのでしょうか。hidden属性か何かでデータベースの他のカラムの値も一緒に投げてあげる必要があるのでしょうか。
mipopon

2020/02/29 10:10 編集

失礼しました。yambejp さんの回答を見逃していました。 エラーメッセージから察するにprepared statement で使用しているパラメータ数が一致しないと言う事なので 多分、以下の2行がエラーの原因では無いでしょうか。 $data=array_merge($data,$keys_bento,$bento); $data=array_merge($data,$keys_okazu,$okazu); ↓ $data=array_merge($date, array_values($bento); $data=array_merge($data, array_values($okazu)); で解決する様な気がします。 array_values() は $bento と $okazu の構造が分からないので一応追加しましたがシンプルな数値配列なら必要なさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問