質問編集履歴

1 少し追記修正しました。

Z-TALBO

Z-TALBO score 493

2016/02/12 19:47  投稿

タイムカード作成に関して
現在個人利用(練習)でタイムカードを作成してみたくやっています。
ページの構成
// index.php 名前を選択して打刻
// insert.php index.phpからの値をDBへ
// Data.php Dataを日時抽出で表示、さらに修正できるようにする
// Update.php Data.phpから修正データを受け取ってupdate
DBの設計
```MySQL
tablename = time
id int not null auto_increment primary key,
name varchar(255),
dakoku varchar(255),
year int,
month int,
day int,
hour int,
minutes int,
secounds int
```
-------
現在indexとinsertに関しては動作確認できました。
Data.phpに関して日付で抽出し、表示はできており、修正用のフォームまではできました。
しかし、Updateがうまくできません。。。
今書いたコード自体にエラーは見られませんが、値がどうも送信されてないか、受け取り方が悪いかであるのかと思います。
どこが、、、というのが今のレベルでは見つけられないのでお知恵を拝借させてください。
-------
```HTML
// Data.php
// 条件抽出用のフォーム
<form action="" method="POST">
// optionは省略しております。
<select name="year_select"></select>
<select name="month_select"></select>
<select name="day_select"></select>
<input type="submit" value="検索">
</form>
// tableで表示しますが、修正した後さらにサブミットしたいので、、、
<form action="update.php" method="POST">
<table>
// 何月何日は抽出で出すので表示させません
<thead>
<th>名前</th><th>打刻種別</th><th>時</th><th>分</th>
</thead>
<tbody>
<?php
 $year = $_POST['year_select'];
 $month = $_POST['month_select'];
 $day = $_POST['day_select'];
 
 // try catchでDBをSELECTします。
 try {
 } catch
while ($row = $stmt->fetch()) :
?>
<tr>
 <td>
   <select name="dakoku">
     <option <?= $row['dakoku'] != '出勤' ?: 'selected' ?>>出勤</option>
     <option <?= $row['dakoku'] != '退勤' ?: 'selected' ?>>退勤</option>
     <option <?= $row['dakoku'] != '休入' ?: 'selected' ?>>休入</option>
     <option <?= $row['dakoku'] != '休戻' ?: 'selected' ?>>休戻</option>
   </select>
 </td>
<td>
   <select name="hour">
     <?php for ($i = 01; $i <= 24; $i++) : ?>
     <option <?= $row['hour'] != $i ?: 'selected' ?>><?= $i; ?></option>
     <?php endfor; ?>
   </select>
 </td>
<td>
   <select name="minutes">
     <?php for ($i = 00; $i <= 59; $i++) : ?>
     <option <?= $row['minutes'] != $i ?: 'selected' ?>><?= $i; ?></option>
     <?php endfor; ?>
   </select>
 </td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<input type="hidden" name="id" value="<?= $row['id']">
<input type="submit" value="保存">
</form>
```
上記のように表示させ、dakoku, hour, minutesだけ変更できるようにセレクトボックスを配置しました。
```PHP
// update.php
$dakoku = $_POST['dakoku'];
$hour = $_POST['hour'];
$minutes = $_POST['minutes'];
$id = $_POST['id'];
try {
$dbh = new PDO(DSN< DB_USER, DB_PASSWORD);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $dbh->prepare(
   "UPDATE time SET dakoku = ?, hour = ?, minutes = ? WHERE id = ?");
$stmt->bindParam(1, $dakoku, PDO::PARAM_STR);
$stmt->bindParam(2, $hour, PDO::PARAM_STR);
$stmt->bindParam(3, $minutes, PDO::PARAM_STR);
$stmt->bindParam(4, $id, PDO::PARAM_STR);
$stmt->execute();
} catch
```
とりあえず上記のようなupdate文を作成しましたが、、、
Data.phpで表示される行数は一行とは当然限りません。。。
最低でも2行はあるでしょう(タイムカードなので、出と退は必ずあるはず)。
それらを、セレクトボックスで複数修正(選択)後、保存のサブミットで一括でUpdateさせたいのですが、上記のコードで修正すべき点を教えていただけますか?
配列やforeachが必要なのかとは思うのですが、、、、
※例外処理や、エスケープなどの事はここでは外して考えていただけますか?
まずは、動作させたいので、、、、
まずは、動作させたいので、、、、
------
【追記編集】
```HTML
<select name="data[]['dakoku']>
<select name="data[]['hour']>
<select name="data[]['minutes']>
<input type="hidden" name="data[]['id']" value="<?= $row['id']; ?>">
```
いろいろ見て回って、上記のようなname属性にしてみて、
```PHP
$dbh->beginTransaction();
foreach($data as $dakoku) {
$stmt->bindParam(1, $data, PDO::PARAM_STR);
var_dump($data); // var_dump($dakoku[?]);
print_r($data); // print_r($dakoku[?]);
```
上記のような形にしてみると、当然なのでしょうが、、Arrayでズラズラ表示されたり$dakoku[??]に数字を入れればそこがとれたりはしましたが、、、
やはり、値としてはとれてないようです。
いろいろ書いてはみるのですが、一向に当たりません。
ご指摘よろしくお願いします。
  • PHP

    37387 questions

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

  • HTML

    23428 questions

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

  • MySQL

    11614 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る