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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

4030閲覧

タイムカード作成に関して

Z-TALBO

総合スコア525

MySQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/02/12 04:37

編集2016/02/12 10:47

現在個人利用(練習)でタイムカードを作成してみたくやっています。

ページの構成
// index.php 名前を選択して打刻
// insert.php index.phpからの値をDBへ
// Data.php Dataを日時抽出で表示、さらに修正できるようにする
// Update.php Data.phpから修正データを受け取ってupdate

DBの設計

MySQL

1tablename = time 2id int not null auto_increment primary key, 3name varchar(255), 4dakoku varchar(255), 5year int, 6month int, 7day int, 8hour int, 9minutes int, 10secounds int

現在indexとinsertに関しては動作確認できました。
Data.phpに関して日付で抽出し、表示はできており、修正用のフォームまではできました。

しかし、Updateがうまくできません。。。
今書いたコード自体にエラーは見られませんが、値がどうも送信されてないか、受け取り方が悪いかであるのかと思います。

どこが、、、というのが今のレベルでは見つけられないのでお知恵を拝借させてください。


HTML

1// Data.php 2// 条件抽出用のフォーム 3<form action="" method="POST"> 4// optionは省略しております。 5<select name="year_select"></select> 6<select name="month_select"></select> 7<select name="day_select"></select> 8<input type="submit" value="検索"> 9</form> 10 11// tableで表示しますが、修正した後さらにサブミットしたいので、、、 12<form action="update.php" method="POST"> 13<table> 14// 何月何日は抽出で出すので表示させません 15<thead> 16<th>名前</th><th>打刻種別</th><th>時</th><th>分</th> 17</thead> 18<tbody> 19<?php 20 $year = $_POST['year_select']; 21 $month = $_POST['month_select']; 22 $day = $_POST['day_select']; 23 24 // try catchでDBをSELECTします。 25 try { 26 27 } catch 28 29 while ($row = $stmt->fetch()) : 30?> 31<tr> 32 <td> 33 <select name="dakoku"> 34 <option <?= $row['dakoku'] != '出勤' ?: 'selected' ?>>出勤</option> 35 <option <?= $row['dakoku'] != '退勤' ?: 'selected' ?>>退勤</option> 36 <option <?= $row['dakoku'] != '休入' ?: 'selected' ?>>休入</option> 37 <option <?= $row['dakoku'] != '休戻' ?: 'selected' ?>>休戻</option> 38 </select> 39 </td> 40 <td> 41 <select name="hour"> 42 <?php for ($i = 01; $i <= 24; $i++) : ?> 43 <option <?= $row['hour'] != $i ?: 'selected' ?>><?= $i; ?></option> 44 <?php endfor; ?> 45 </select> 46 </td> 47 <td> 48 <select name="minutes"> 49 <?php for ($i = 00; $i <= 59; $i++) : ?> 50 <option <?= $row['minutes'] != $i ?: 'selected' ?>><?= $i; ?></option> 51 <?php endfor; ?> 52 </select> 53 </td> 54</tr> 55<?php endwhile; ?> 56</tbody> 57</table> 58<input type="hidden" name="id" value="<?= $row['id']"> 59<input type="submit" value="保存"> 60</form> 61

上記のように表示させ、dakoku, hour, minutesだけ変更できるようにセレクトボックスを配置しました。

PHP

1// update.php 2$dakoku = $_POST['dakoku']; 3$hour = $_POST['hour']; 4$minutes = $_POST['minutes']; 5$id = $_POST['id']; 6 7try { 8 $dbh = new PDO(DSN< DB_USER, DB_PASSWORD); 9 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 10 $stmt = $dbh->prepare( 11 "UPDATE time SET dakoku = ?, hour = ?, minutes = ? WHERE id = ?"); 12 $stmt->bindParam(1, $dakoku, PDO::PARAM_STR); 13 $stmt->bindParam(2, $hour, PDO::PARAM_STR); 14 $stmt->bindParam(3, $minutes, PDO::PARAM_STR); 15 $stmt->bindParam(4, $id, PDO::PARAM_STR); 16 $stmt->execute(); 17} catch

とりあえず上記のようなupdate文を作成しましたが、、、

Data.phpで表示される行数は一行とは当然限りません。。。
最低でも2行はあるでしょう(タイムカードなので、出と退は必ずあるはず)。

それらを、セレクトボックスで複数修正(選択)後、保存のサブミットで一括でUpdateさせたいのですが、上記のコードで修正すべき点を教えていただけますか?
配列やforeachが必要なのかとは思うのですが、、、、

※例外処理や、エスケープなどの事はここでは外して考えていただけますか?
まずは、動作させたいので、、、、


【追記編集】

HTML

1<select name="data[]['dakoku']> 2<select name="data[]['hour']> 3<select name="data[]['minutes']> 4<input type="hidden" name="data[]['id']" value="<?= $row['id']; ?>">

いろいろ見て回って、上記のようなname属性にしてみて、

PHP

1$dbh->beginTransaction(); 2foreach($data as $dakoku) { 3$stmt->bindParam(1, $data, PDO::PARAM_STR); 4 5var_dump($data); // var_dump($dakoku[?]); 6print_r($data); // print_r($dakoku[?]);

上記のような形にしてみると、当然なのでしょうが、、Arrayでズラズラ表示されたり$dakoku[??]に数字を入れればそこがとれたりはしましたが、、、

やはり、値としてはとれてないようです。

いろいろ書いてはみるのですが、一向に当たりません。
ご指摘よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

送信データの取り扱いにだいぶ悩まれているようなので、POST周りの動くサンプルコードを上げておきます。データベースの関連部分は書いてありません。
複数の出退勤データを一気に更新できる仕様です。
サンプルコードにはid項目がありませんので追加してみてください。
(見づらいソースコードですみません。)

丸ごとコピーしてtest.phpなどのファイル名を付けて文字コードUTF-8, 改行コードLFで保存してください。

送信されたフォームの配列データが$_POSTにどのように入って、値を取り出すにはどうしたら良いか書き換えたりして試してみてください。

質問に書かれたように、フォームのinputのname内の要素名の真ん中に空の[]があると配列が深くならずに以下のようになってしまいます。

HTML

1<select name="data[]['dakoku']"> 2<select name="data[]['hour']"> 3<select name="data[]['minutes']">

$_POST['data'][0]['name'] = なまえ1
$_POST['data'][1]['dakoku'] = 出勤
$_POST['data'][2]['hour'] = 8
$_POST['data'][3]['minutes'] = 12
$_POST['data'][4]['name'] = なまえ2
$_POST['data'][5]['dakoku'] = 退勤
$_POST['data'][6]['hour'] = 19
$_POST['data'][7]['minutes'] = 56
$_POST['submit'] = 送信

添字に数字を入れると下のようになります。

<select name="data[0]['dakoku']"> <select name="data[0]['hour']"> <select name="data[0]['minutes']"> ```$_POST['data'][0]['name'] = 山田 太郎 $_POST['data'][0]['dakoku'] = 出勤 $_POST['data'][0]['hour'] = 07 $_POST['data'][0]['minutes'] = 12 $_POST['data'][1]['name'] = 山田 太郎 $_POST['data'][1]['dakoku'] = 退勤 $_POST['data'][1]['hour'] = 17 $_POST['data'][1]['minutes'] = 00 ```PHP <? if( !empty( $_POST ) ) { //POSTされている場合には row[] に代入する $ary = $_POST['data']; $row_ct = count( $ary );//_POST['data']の要素数 for( $i=0; $i<$row_ct; $i++ ) { //配列の添字が数値の場合は変数に代入して指定する // $row = $_POST; でも同じ結果になるが説明の為に個別に代入している $row['data'][$i]['name'] = $_POST['data'][$i]['name']; $row['data'][$i]['dakoku'] = $_POST['data'][$i]['dakoku']; $row['data'][$i]['hour'] = $_POST['data'][$i]['hour']; $row['data'][$i]['minutes']= $_POST['data'][$i]['minutes']; } } else { //POSTされていない場合(初期値) //本来はDBから取得する //テスト用データ $row = array( "data" => array( array( "name" => "山田 太郎", "dakoku" => "出勤", "hour" => "07", "minutes" => "12" ), array( "name" => "山田 太郎", "dakoku" => "退勤", "hour" => "17", "minutes" => "00" ), array( "name" => "鈴木 花子", "dakoku" => "出勤", "hour" => "07", "minutes" => "59" ), array( "name" => "鈴木 花子", "dakoku" => "休入", "hour" => "12", "minutes" => "01" ), array( "name" => "鈴木 花子", "dakoku" => "休戻", "hour" => "12", "minutes" => "58" ), array( "name" => "鈴木 花子", "dakoku" => "退勤", "hour" => "21", "minutes" => "03" ) ) ); //row['data']の要素数 $row_ct = count( $row['data'] ); } ?> <?php echo '<?xml version="1.0"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>出退勤管理画面</title> </head> <body> <div id="wrapper"> <h1>出退勤管理</h1> <div id="contents"> <div id="container"> <br /><h2>出退勤</h2><br /> <div class="alcenter"> <form id="form1" name="form1" class="form1" method="post" action=""> <? print "件数:" . $row_ct ."件<br>\n"; for( $no=0; $no<$row_ct; $no++ ) { ?> 氏名<input type ='text' name='data[<?=$no;?>][name]' id='data[<?=$no;?>][name]' size='10' value='<?= $row['data'][$no]['name']; ?>' /> 打刻<input type ='text' name='data[<?=$no;?>][dakoku]' id='data[<?=$no;?>][dakoku]' size='10' value='<?= $row['data'][$no]['dakoku']; ?>' /> <select name="data[<?=$no;?>][hour]"> <? for ($i = 0; $i <= 23; $i++) { $str = sprintf( "%02d", $i );//書式設定 ?> <option value="<?= $str; ?>"<? if( $row['data'][$no]['hour']==$str ) { print " selected"; }?>><?= $str; ?></option> <? } ?> </select>時 <select name="data[<?=$no;?>][minutes]"> <? for ($i = 0; $i <= 59; $i++) { $str = sprintf( "%02d", $i );//書式設定 ?> <option value="<?= $str; ?>"<? if( $row['data'][$no]['minutes']==$str ) { print " selected"; }?>><?= $str; ?></option> <? } ?> </select>分<br> <? } ?> <input type="submit" name="submit" id="submit" value="送信" /> <? if( !empty( $_POST ) ) { /* // $_POST確認(出力する場合はコメントを外してください) print "<br><br>\n"; print_r( $_POST ); print "<br><br>\n"; */ print "<br><br>\n"; //配列内の要素のアクセス名と値の一覧を出力する print "配列内容(&#36;_POST):<br>"; dispPostData( "", "&#36;_POST", $_POST, 0 ); print "<br><br>\n"; print "配列内容(&#36;row):<br>"; dispPostData( "", "&#36;row", $row, 0 ); print "<br><br>\n"; } //配列の中身を表示する関数 // name: 配列の階層名 // array_name: 配列の名前 // ary: 配列 // depth: 配列の深さ function dispPostData( $name=array(), $array_name="", $ary, $depth ) { foreach( $ary AS $key => $val ) { if( is_array( $val ) ) { //$val が配列の場合 $name2 = $name; $name2[] = $key;//要素名リストにキー名を追加する //配列なら再帰処理を行う dispPostData( $name2, $array_name, $val, $depth + 1 ); } else { //$val が値の場合 for( $i = 0; $i < $depth; $i++ ) { print "&nbsp;&nbsp;";//インデント } print $array_name;//配列名の出力 if( !empty( $name ) ) { //配列の要素名の出力 foreach( $name AS $val2 ) { if( preg_match("/[^0-9\s]/", $val2 ) ) { print "['" . $val2 . "']";//文字列 } else { print "[" . $val2 . "]";//数字 } } } if( preg_match("/[^0-9\s]/", $key ) ) { print "['" . $key . "']";//文字列 } else { print "[" . $key . "]";//数字 } //値の出力 print " = " . $val . "<br>\n"; } } } ?> </form> </div> </div> </div> <!-- ▲ Contents --> <!-- ▽ Footer --> <div id="foot"> CopyFree 2016 HogeHage.co.,Ltd. All Rights Reserved.</div> </div> <!-- ▲ Footer --> </div> <!-- ▲ Wrapper --> </body> </html>

動作確認: Windows7 Firefox 44.0 / Wadax WX共用サーバー

投稿2016/02/13 03:45

編集2016/02/13 04:29
chinyato

総合スコア241

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

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

Z-TALBO

2016/02/15 12:28

これだけのコードをありがとうございます! いろいろやってみるのに時間かかるかもしれないので、一度質問はBAつけておきます!
guest

0

こっちはどうですか?
ちなみにダブルクオーテーションの区切りがおかしかったですよ。

php

1<select name="data['dakoku'][]"> 2<select name="data['hour'][]"> 3<select name="data['minutes'][]"> 4<input type="hidden" name="data['id'][]" value="<?= $row['id']; ?>">

参考:PHP:POSTの値を、多次元配列にしたい。

投稿2016/02/12 14:55

K_S_

総合スコア419

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

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

Z-TALBO

2016/02/12 17:39

解答ありがとうございます。 検証してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問