現在個人利用(練習)でタイムカードを作成してみたくやっています。
ページの構成
// 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[??]に数字を入れればそこがとれたりはしましたが、、、
やはり、値としてはとれてないようです。
いろいろ書いてはみるのですが、一向に当たりません。
ご指摘よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/15 12:28