プロが教えるわが家の防犯対策術!

【PHPとDBの連動】時刻表作成
PHPとDBを利用して、このような時間表を作成したいのです。

| 時 | 到着 |
| 間 | 時間(分)|
----------------
| 6 |     |
| 7 | 00  30 |
| 8 |     |
| 9 |     |
| 10 | 24   |
| 11 |     |
| 12 | 30  57 |
| 13 |     |
  :
  :
  :
| 23 | 03   |
| 24 |     |

反映させるDBは以下のとおり

テーブル名:time

|番 | 時 |
|号 | 刻 |
------------
| 1 | 7:00 |
| 2 | 7:30 |
| 3 | 10:24|
| 4 | 12:20|
| 5 | 12:57|
| 6 | 23:03|
------------

このDBの内容を、上の表にある時間と照らし合わせ、
表の7時の欄にはDBの番号(1)と(2)にある「7:00」と「7:30」の「分」の部分だけを
「到着時間(分)」に表示させたいんです。

どのようにすればいいのか全く分からないので、
難しい説明ですが、どうかお願いします。

A 回答 (3件)

>時間表に関する「時間」は、PHP側で出しておきたいんです。



同感です。SQLになんでもやらせるよりは、その方がいいですね。

こんなかんじでどうですか?

$sql=<<<eof
select `時間`,group_concat(`分` separator ' ') as `到着時間(分)`
from (select hour(時刻) as `時間`,DATE_FORMAT(時刻,'%i') as `分` from `時刻表テーブル`) as sub
group by `時間`
eof;

$res=mysql_query($sql);
while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$jikoku[$rows["時間"]]=$row["到着時間(分)"];
}

$tempHtml="";
for($i = 6; $i <= 24; $i++){
$tempHtml .= "<tr><td>{$i}</td><td>{$jikoku[$i]}</td></tr>\n";
}

print "<table>{$tempHtml}</table>";

この回答への補足

返事が遅くなり、大変申し訳ございません。
もうひとつだけ補足が・・・、何度も申し訳ないです。


説明本文の前半は実は、DBではないんです。

PHPであのように表示させたいという、完成予想図みたいなものなんです。
ですので、上の表にある「時間」や「到着時間(分)」も、DBの列名ではなく、PHPで記入したものなのです。

今のところ、PHP上に時間(6時~24時の欄)を表示させることはできました。
しかし、DBに登録している時刻をうまくページに載せることができませんでした。


もしかしたら、画像つきで同じ質問をするかもしれません。今の状態では伝わりにくいのも当たり前ですからね・・・。
本当にyambejpさんには迷惑かけてしまいました。申し訳ございません。

補足日時:2010/01/20 09:06
    • good
    • 0
この回答へのお礼

大変遅くなってしまい、申し訳ございません。
yambejpさんの回答を元に、期待していた結果が返ってきて、解決できました。
本当にありがとうございました。

お礼日時:2010/01/27 09:20

>テーブル名:time



予約語のからみがあるので時刻表テーブルとします。

create table `時刻表テーブル`(`番号` int,`時間` time);
insert into `時刻表テーブル` value(1,'7:00' ),(2,'7:30' ),(3,'10:24'),(4,'12:20'),(5,'12:57'),(6,'23:03');

ここで以下のSQLで処理をすれば当座分の時刻表がえられます。

select `時間`,group_concat(`分` separator " ") as `到着時間(分)`
from (select hour(時刻) as `時間`,DATE_FORMAT(時刻,"%i") as `分` from `時刻表テーブル`) as sub
group by `時間`;

6時から24時まで空欄も含めてだすなら、時刻管理テーブルを用意しておき

create table `時間管理テーブル`(`時刻` int);
insert into `時間管理テーブル` values(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24);

こうします

select `時間`,COALESCE(`分`,"") as `到着時間(分)`
from `時間管理テーブル`
left join(
select `時間`,group_concat(`分` separator " ") as `分`
from (select hour(時刻) as `時間`,DATE_FORMAT(時刻,"%i") as `分` from `時刻表テーブル`) as sub
group by `時間`
) as sub2 using (`時間`)

この回答への補足

あ、大事なことを書き忘れていました。申し訳ございません。

できれば、時間表に関する「時間」は、PHP側で出しておきたいんです。
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今はPHPでこんな感じにやっています。

    for($i = 6; $i <= 24; $i++){
        $tempHtml .= "<tr>";

        $tempHtml .= "<td>$i</td>";

             :
             :

        $tempHtml .= "</tr>\n";
    }

<html>
  :
 <?= $tempHtml ?>
  :
</html>

何度も質問してしまい、申し訳ございませんが、
どうかよろしくお願いします。

補足日時:2010/01/15 14:51
    • good
    • 0

(時刻6~24まで繰り返し as $i){


1:時間$iに対し表示するデータをDBから持ってくる
2:分の部分だけ抜き出し。
3:表示する
}
とすればいいかと思います。
分に抜き出すのはDB上でやる場合とPHPでやる場合が考えられます。

※実際に私が作るのでしたら、DBのtimeに日付を追加し登録する時刻と分を分けるとかやると思います。
あと繰り返してDBから抜き出すものめんどうなので、同じ日のデータを時間と分で分けて抜き出して時の多次元配列とかに入れてしまったほうが効率がよいと思います。

この回答への補足

回答ありがとうございます。ではこの場合はやはり「foreach」を使っていったほうがいいのでしょうか?
自分でも調べていくのですが、どうかよろしくお願いします。

補足日時:2010/01/15 11:01
    • good
    • 0
この回答へのお礼

大変遅くなりましたが、解決できました。
かなり困っていた部分だったので、本当にありがとうございました。

お礼日時:2010/01/27 09:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!