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

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

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

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

PHP

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

2207閲覧

mysqlテーブルの全レコードを区切ってブラウザ出力がなかなかできない…

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2016/05/20 08:58

○現在の各状態
・各テーブル
users_infoテーブル
ユーザーの基本情報
イメージ説明

days_infoテーブル
PHP側で指定してInsertした日付一覧
イメージ説明

attendances_infoテーブル
各ユーザーのその日の勤怠状況
イメージ説明

・PHPソース

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="AppStyle.css"> <title>勤怠状況</title> </head> <body> <?php //-- MySQL接続文省略 --// //ユーザー情報参照 $query = mysql_query('select * from users_info'); //PHP側で入力し指定した日付参照 $days = mysql_query('select days from days_info'); //各ユーザーの勤怠状況参照 $attendances = mysql_query('select attendances from attendances_info'); print("<div>"); print("<form method='POST' action='./RegistTabaleData.php'>"); print('<table border="1" align="center">'); print("<tr><th></th>"); //日付レコード参照 while ($row = mysql_fetch_array($days)) { print("<th>".$row['days']."</th>"); } print("</tr>"); //送信ボタン $button = "<input name='submission' type='submit' value='送信'/>"; //ユーザー名参照 while ($row = mysql_fetch_assoc($query)) { $user_name = $row['user_name']; print("<tr><td>".$user_name."</td>"); //-- ここが問題 --// //勤怠状況参照 while($day = mysql_fetch_assoc($attendances)){ $selectBox = "<select name='selects[]'><option>".$day["attendances"]."</option><option>早退</option><option>休暇</option><option>出勤</option>"; print("<td>".$selectBox."</td>"); } print("</tr>"); } print("<tr><td>".$button."</td></tr>"); print('</table>'); print("</form>"); print("</div>"); ?> </body> </html>

・ブラウザでの実行
イメージ説明

最終的に以下の状態を望んでます。
イメージ説明

○質問
レコードを上記の画像のように区切ることがうまく行きません。
アルゴリズム的な問題かも知れませんが、やり方の問題もあるかと考えています。
どうすればうまく区切れるのか、、わかる方ご教授お願いします。

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

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

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

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

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

guest

回答2

0

回答を書いてるうちに解決されてましたが、せっかくなので載せます(笑

//-- ここが問題 --//
の部分の勤怠状況参照のループ処理で全てのデータを処理してしまっているのが原因かと思われます。

端折って書くと以下のようになりますが

//ユーザー名参照 while() { // ←ループ1 //勤怠状況参照 while() { // ←ループ2 // 横一列にならぶ問題の箇所 } }

[ループ2]にて9回ループしているようです。(つまり3人×3日分のデータ)
ここで、一人分の処理が終わったら[ループ2]を抜けてしまえば上手くいきそうです。

ただし、

$day = mysql_fetch_assoc($attendances)

DBから1行ずつ取得しているので、今のままのコードでは見づらかったり分かりづらかったりします。
ですので、多少処理に無駄があっても分かりやすいコードにしてみた方がいいと思います。

/* DBからデータを取得する準備 */ // [ユーザー情報参照]と[PHP側で入力し指定した日付参照]は省略 // 各ユーザーの勤怠状況参照 // $attendances = mysql_query('select attendances from attendances_info'); // ↓ 全項目取得に修正 $attendances = mysql_query('select * from attendances_info'); /* データを取得し配列に格納する処理を行う */ // ユーザー名参照 $users = array(); while ($row = mysql_fetch_assoc($query)) { // ←ループ1 $users[] = $row; // ←データを用意する } // 勤怠状況参照 $attendanceDatas= array(); while ($day = mysql_fetch_assoc($attendances)) { // ←ループ2 $attendanceDatas[] = $day; // ←データを用意する } /* 用意された配列データを用いて表示を行う */ foreach ($users as $user) { foreach ($attendanceDatas as $data) { // ここでの$dataは質問者さんの$dayに相当 if ($user['user_name'] == $data['user_name']) { // 表示を行う、または表示するものを準備する } } }

大体このようになるかと思います(一部抜粋なのでちゃんと動くように補完してください)

(DBのデータを配列に入れなおす処理、実は一発で全て取得する関数があるのでループを回す必要がなかったりしますが、分かりづらいと思うのでとりあえず今回は上記のような形と致しました)

投稿2016/05/20 10:04

tonarino210

総合スコア228

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

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

退会済みユーザー

退会済みユーザー

2016/05/21 03:20

ご回答、本当に有難うございます。 foreachでネストする手があったなんて…思いつかなかったです。 大変参考になりした。
guest

0

ベストアンサー

php

1//勤怠状況参照 2while($day = mysql_fetch_assoc($attendances)){

ですが、SQL が以下のようになっており、一度に全ユーザー分の出欠情報を取ってきてしまっています。

sql

1select attendances from attendances_info

これを、以下のようにして、外側の while ループでいま注目してるユーザー $user_name についてのみの出欠情報を取ってくればうまく動くと思います。

sql

1select attendances from attendances_info where user_name = '$user_name'

すみません、このような SQL を PHP でどう書くかはわからない(10年以上触ってないので忘れてしまった)ので、正しい書き方を調べてみてください。

投稿2016/05/20 09:18

tatsuya6502

総合スコア2035

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

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

退会済みユーザー

退会済みユーザー

2016/05/20 09:34

ご回答、大変うれしいです。 やって見てうまくいきました! SQLで条件式が使えることは知ってますが、こんな風に使えるんですね!大変参考になりました。本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問