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

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

ただいまの
回答率

89.72%

配列データの受取について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,504

Z-TALBO

score 491

まず、データの送信側に関してのコードです。

// DBからデータを受け取る
while($row = $stmt->fetch()) {
  $row = array(
    "data" => array(
      array(
        "id" => $row['id'],
        "name" => $row['name'],
        "dakoku" => $row['dakoku']),
      )
     );
  $row_ct = count($row['data']);

  for($no = 0; $no < $row_ct; $no++) {
?>
<form action="update.php" method="post">
<tr>
<td> <?= h($row['data'][$no]['name']); ?> </td>
<td> <select name="data[<?= $no; ?>]['dakoku']" value="<?= h($row['data'][$no]['dakoku']; ?>">
<option <?= $row['data'][$no]['dakoku'] != '出勤' ?: 'selected' ?> value="出勤">出勤</option>
<option <?= $row['data'][$no]['dakoku'] != '退勤' ?: 'selected' ?> value="退勤">退勤</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休入">休入</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休戻">休戻</option>
</select>
<td>
<?php } ?>
<?php } ?>
</tr>
<input type="submit" value="保存">


だいぶ省略したりとかありますが、、、、
上記のようなコードを作成し、表示させると、データベースに入っていたのが表示させることはできました。

例えばで、updata.phpにてprint_r($_POST)してみたのですが、最後の行の一行しかPOSTされていない様子です。

氏名:テスト 打刻:出勤 時:12 分:30
氏名:テスト 打刻:退勤 時:18 分:30
保存
と表示されたとして、保存をクリックしたら、
Array([data]=>Array([0]=>Array(['dakoku']=>退勤//あと省略)
だったのです。

解決法はどのようになるでしょうか?


【追記】
回答いただいた内容での修正です。
※回答いただいた内容のままではあります。

// DBからデータを受け取る
while($row = $stmt->fetch()) {
  $row['data'][] = array(
          array(
              "id" => $row['id'],
              "name" => $row['name'],
              "dakoku" => $row['dakoku']),
           );
 ** // whileの閉じタグをここに変更**
  }
  $row_ct = count($row['data']);

  for($no = 0; $no < $row_ct; $no++) {
?>
<form action="update.php" method="post">
<tr>
<td> <?= h($row['data'][$no]['name']); ?> </td>
<td> <select name="data[<?= $no; ?>]['dakoku']" value="<?= h($row['data'][$no]['dakoku']; ?>">
<option <?= $row['data'][$no]['dakoku'] != '出勤' ?: 'selected' ?> value="出勤">出勤</option>
<option <?= $row['data'][$no]['dakoku'] != '退勤' ?: 'selected' ?> value="退勤">退勤</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休入">休入</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休戻">休戻</option>
</select>
<td>
<?php } ?>
</tr>
<input type="submit" value="保存">


上記のようにwhileの閉じタグを変更してみましたが、、、
そうなると、そもそもデータが表示されなくなりました。エラーは出ていません。

whileを閉じてしまったから?でしょうか?
質問時のコードであれば、値などは表示されます。


【追記】
最初の質問のコードでの話しですが、

while($row =
※省略させていただきます
$row_ct = count($row['data']);
の後に、var_dump($row);
// array(1){["data"]=>array(1){[0]=>array(3){["id"]=>○○["name"]=>○○["dakoku"]=>○○}}}
// array(1){["data"]=>array(1){[0]=>array(3){["id"]=>××["name"]=>××["dakoku"]=>××}}}
となりました。
var_dump($row_ct);だと
int(1)int(1)となりました


※データが2行あった事としています。
こういう部分がもしかして原因なのか?ということも考えられませんか?
結局data[0]['dakoku']と数字の部分がうまく行ってないのかなと思ったのですが、、、、

回答の参考になればと思います。。。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

whileループの閉じる位置が違うため、nameがすべて同じになっているのではないでしょうか?
次のようにするとどうですか?

// DBからデータを受け取る
$row = array();
while($row = $stmt->fetch()) {
  $row['data'][] = array(
      array(
        "id" => $row['id'],
        "name" => $row['name'],
        "dakoku" => $row['dakoku']),
      )
     );
}
  $row_ct = count($row['data']);

  for($no = 0; $no < $row_ct; $no++) {
?>
<form action="update.php" method="post">
<tr>
<td> <?= h($row['data'][$no]['name']); ?> </td>
<td> <select name="data[<?= $no; ?>]['dakoku']" value="<?= h($row['data'][$no]['dakoku']; ?>">
<option <?= $row['data'][$no]['dakoku'] != '出勤' ?: 'selected' ?> value="出勤">出勤</option>
<option <?= $row['data'][$no]['dakoku'] != '退勤' ?: 'selected' ?> value="退勤">退勤</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休入">休入</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休戻">休戻</option>
</select>
<td>
<?php } ?>
</tr>
<input type="submit" value="保存">

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/19 15:29

    回答ありがとうございます!
    上記のように、一回whileを閉じるというやり方でやってみました。
    その場合、、、、
    そもそもデータが表示されないということになってしまいました。。。
    例えば2件データがあったときに、その行も出てこない状況、、、
    閉じタグを元に戻すと、データは2件あるということで表示されました($row[][]を直してないので、値は出てこなかったですが、、、)

    endwhile的なやり方でやっているので、まず閉じてしまうとできなくなるのかな?
    それとも、何かやり方が間違ってしまっているでしょうか?

    キャンセル

  • 2016/02/19 16:10

    修正後コードを載せてください。

    キャンセル

checkベストアンサー

0

まず以下のfetchで$rowにクエリの結果を代入してしまってますね。
while( $result = $stmt->fetch()) { のように別の変数名でfetchしないとループ毎に$rowが上書きされています。

while($row = $stmt->fetch()) {
  $row = array(
    "data" => array(
      array(
        "id" => $row['id'],


次に下のselectタグのoptionのソースコードを作成する時に $row['data'][$no]['dakoku'] と同じ配列構造にするなら、$row['data'][] =array( ‥という風に配列要素を追加しないとなりません。

while( $result = $stmt->fetch( PDO::FETCH_ASSOC ) ) {
    $row['data'][] = array(
        "id" => $result['id'],


あとは先の回答者の方のを参考にされたようにwhileループを閉じてからfor文で回せば大丈夫でしょう。
以下確認済検証コードです。

try{
        $dsn = 'mysql:dbname=' . $MYDB_NAME . ';host=localhost';
        $dbh = new PDO( $dsn, $MYDB_USER, $MYDB_PWORD );
        if( $dbh != NULL ) {
            $sql = 'select id, name, dakoku, hour, minutes from syuttaikin';
            $stmt = $dbh->query( $sql );
            while( $result = $stmt->fetch( PDO::FETCH_ASSOC ) ) {
                $row['data'][] = array(
                    "id" => $result['id'],
                    "name" => $result['name'],
                    "dakoku" => $result['dakoku'],
                    "hour" => $result['hour'],
                    "minutes" => $result['minutes']
                );
            }
            $dbh = NULL;
        }
    } catch ( PDOException $e ) {
        $err_msg = ('DB Query Error : '.$e->getMessage() );
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/19 19:30

    コメントしたのですが、、できておりませんでした。
    回答ありがとうございます!
    先のサンプルも知識として使ってみていますが、だから、、、こうなって~~って感じでフワフワした感じになっております><

    まだ、問題が出てくるかと思いますので、またよろしくお願いいたします。

    キャンセル

0

$rowがダブって使われています。
DBから取得する変数を変えればいいんじゃないですか?
この$rowは後で使うから、、保存しているんですよね?

<?php
// DBからデータを受け取る
$row = array();
while($data = $stmt->fetch()) {
  $row['data'][] = array(
    array(
      "id" => $data['id'],
      "name" => $data['name'],
      "dakoku" => $data['dakoku'],
    )
  );
}
$row_ct = count($row['data']);

for($no = 0; $no < $row_ct; $no++):
?>
<form action="update.php" method="post">
<tr>
<td><?= h($row['data'][$no]['name']) ?> </td>
<td><select name="data[<?= $no ?>]['dakoku']" value="<?= h($row['data'][$no]['dakoku'] ?>">
<option <?= $row['data'][$no]['dakoku'] != '出勤' ?: 'selected' ?> value="出勤">出勤</option>
<option <?= $row['data'][$no]['dakoku'] != '退勤' ?: 'selected' ?> value="退勤">退勤</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休入">休入</option>
<option <?= $row['data'][$no]['dakoku'] != '休戻' ?: 'selected' ?> value="休戻">休戻</option>
</select>
<td>
<?php endfor; ?>
</tr>
<input type="submit" value="保存">

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/19 19:00

    すみません、回答中に編集しておりました。。。
    検証してみます!

    キャンセル

  • 2016/02/19 19:03

    そもそも、$rowは後で使いますか?
    使わないなら、whileループだけでやったほうがいいと思いますよ。もっと短くなりますし。

    キャンセル

  • 2016/02/19 19:19

    ありがとうございます!
    ちゃんと行が取得できました!!!

    値のとり方が少し違っており、どうなのかと思いましたが解決できました!

    $rowというのは、質問でのコードを見ていただくとおりの部分でしか使用しておりません。
    whileループだけでやるというのが、現在の知識ではピンときておりません><

    キャンセル

  • 2016/02/19 19:29

    $rowに入れたのは質問者さんの前の質問がPOSTデータの配列の構造についてだったので、私の回答がPOSTデータと初期データを同じ配列構造で作るサンプルを提示した為だと思います。

    shi_ueさんの指摘のようにrowを使いまわしたりしなければwhileループ内でHTMLを作成するのが簡単でしょう。
    HTMLのヘッダより前で処理して残業時間とか遅刻の時間など計算したりBODY内でフォームを作るなら、いったんrowに代入しても良いかと思います。(ケースバイケースで)

    キャンセル

0

ベストアンサーが選ばれていますが、$rowは後々使わないということなので、

<?php
// DBからデータを受け取る
$no = 0;
while($row = $stmt->fetch()):

?>
<form action="update.php" method="post">
<tr>
<td> <?= h($row['name']) ?> </td>
<td> <select name="data[<?= $no ?>]['dakoku']" value="<?=h($row['dakoku']) ?>">
<option <?= $row['dakoku'] != '出勤' ?: 'selected' ?> value="出勤">出勤</option>
<option <?= $row['dakoku'] != '退勤' ?: 'selected' ?> value="退勤">退勤</option>
<option <?= $row['dakoku'] != '休戻' ?: 'selected' ?> value="休入">休入</option>
<option <?= $row['dakoku'] != '休戻' ?: 'selected' ?> value="休戻">休戻</option>
</select>
<td>
<?php

  $no++;
endwhile;
?>
</tr>
<input type="submit" value="保存">


簡単になりました。
こんな感じでいいとおもいますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/19 22:51

    ベストアンサーをどなたに、、、と悩んでしまって、、、
    追加でのコメント大変ありがとうございます!
    すっきりするんですね!
    参考にさせていただきます!

    キャンセル

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

  • ただいまの回答率 89.72%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る