PHP&MySQLでスケジュール表示プログラムを作成

このQ&Aのポイント
  • PHP&MySQLを使用して、社員の1週間分のスケジュールを一覧表示するプログラムを作成中です。しかし、日付をまたぐ際にうまく動作しない問題が発生しています。
  • 店舗情報と従業員情報、予定情報をそれぞれのテーブルに格納しています。営業時間が切り替わると日付とスケジュールが一覧表示されるようにしたいのですが、0時を過ぎた場合にうまく動作しません。
  • Excelで出力イメージの画像も添付しています。ソースコードや参考になる情報を提供していただけると助かります。急ぎの案件なので、早めの回答をお願いします。
回答を見る
  • ベストアンサー

PHP&MySQL日付をまたぐスケジュール表示

初めて質問します。 社員スケジュールを1週間分一覧出来るプログラムをPHP&MySQLで作ってます。 どうしても出来なかったです。 【shop (支店テーブル)】 shop_id ※オートインクリメント 支店ID name ※支店名 start_time ※Time型?お店の時間は固定 営業開始時間 last_time ※Time型?お店の時間は固定 営業終了時間 【worker (従業員テーブル)】 worker_id ※オートインクリメント 従業員ID shop_id ※支店ID worker_name ※従業員名 【schedule (予定テーブル)】 schedule_id ※オートインクリメント 予定ID worker_id ※従業員ID start_time ※DateTime型 勤務開始予定時間 last_time ※DateTime型 勤務終了予定時間 条件 1.お店の営業時間で日付とスケジュール一覧が切り替わる。 0:00を過ぎた場合、どうしても上手に出来ません。 言葉だけでは伝わりにくいと思うのでExcelで出力イメージの画像も添付してます。 そのまま貼って使える様なソース等教えて戴けたら、ポイント等・・・ 知恵を貸して戴けるだけでも助かります。 急ぎ目なのでお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

>1.お店の営業時間で日付とスケジュール一覧が切り替わる。 > 0:00を過ぎた場合、どうしても上手に出来ません。 0:00を過ぎなければ、うまく行くんですよね? とりあえず、その店舗が日付をまたいで営業するかどうかはlast_time<start_timeかどうかで判定できますね。 last_time<start_timeの店舗で、かつ、現在時刻<last_timeであれば、前日のスケジュールを表示すると判定できますね。※1 一応書くと、scheduleから従業員の予定を取得する際には、start_timeのみで絞り込めば問題ありません。 もしかすると、0:00を過ぎるとうまくいかないというのは、shop+worker+scheduleを結合して一度に取得しようとしていますか? 作ろうとしているのは、店舗毎に一覧表示という仕様だとおもいます。 (そうでないと、一覧表示する際に日付をまたぐ店舗だけは前日を開始日として一週間分表示というのは、全体として整合性が取れない) まず、対象のshopのデータを取得して、開始日を※1の条件で判定する。 開始日+7日して終了日を計算、worker+scheduleを結合して一覧表を作成という風に二段階に分けると簡単ですよ。

saorixs
質問者

お礼

詳しく考え方教えて戴き有難う御座います。 ベルベルさんの意見を参考にしながら頑張ってみます!

関連するQ&A

  • PHP&MySQL従業員一覧に対するスケジュール

    2回目の質問です。 社員スケジュールを1週間分一覧出来るプログラムをPHP&MySQLで作ってます。 どうしても出来なかったです。 【shop (支店テーブル)】 shop_id ※オートインクリメント 支店ID name ※支店名 start_time ※Time型?お店の時間は固定 営業開始時間 last_time ※Time型?お店の時間は固定 営業終了時間 【worker (従業員テーブル)】 worker_id ※オートインクリメント 従業員ID shop_id ※支店ID worker_name ※従業員名 【schedule (予定テーブル)】 schedule_id ※オートインクリメント 予定ID worker_id ※従業員ID start_time ※DateTime型 勤務開始予定時間 last_time ※DateTime型 勤務終了予定時間 出力させたいのが支店の全従業員の名前と1週間分のデータなのですが、日付の出力までは出来ています。 予定の入って無い従業員に対しても、一覧表示に出したいのですがどうしても出来ません。 ※予定の入ってる従業員だけ出力するのは出来ます。 この場合、日付だけのテーブルを別途用意して連結させたら実現出来るのでしょうか? それとも複雑なSQL文で抽出する事が出来るのでしょうか? DBの構造変えたら作るよ!等の知恵を貸して戴けたら幸いです。 実現させたい出力イメージを画像で添付します。 宜しくお願いします。

  • 【PHP,MySQL】連番の付け方について

    連番を下記の様に付けたいのですが、どなたかご教授ください。 参考になるURLでも結構です。 【環境】 ・MySQL バージョン: 5.1.41 ・PHP バージョン: 5.3.1 【現状】 ○親テーブル:nou_itiran ・entry_id [int(11)][auto_increment]主 ・その他カラム ○子テーブル:nou_ko ・ko_id [int(11)][auto_increment]主 ・entry_id [int(11)]←親テーブルの主キー値が入る ・その他カラム 2つのテーブルを作成しています。 親テーブルのカラム[entry_id]に対して、子テーブルの[ko_id]に 副番号をつけたいのですが、考え方がまとまりません。 現在は、 [親entry_id]/[子ko_id] 456/1 456/2 457/3 457/4 458/5 458/6 459/7 ・ ・ のように、[親entry_id]と[子ko_id]は個々に連番が発生します。 *********** 【達成したい内容】 456/1 456/2----★ 457/1 457/2----★ 458/1 458/2 459/3----★ [親entry_id]に対して、何番まで使われたか(★)を他のテーブルで 保持しておけばよいのかも??と思うのですが、 具体的な手法がわかりません。 ************* MySQLへのセレクト、インサートはPHPから行っております。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHPとMysqlを使用した集計表の作り方

    --------------媒体-------------- CREATE TABLE IF NOT EXISTS `media` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `media` (`id`, `name`) VALUES (1, 'yahoo'), (2, '楽天'), (3, '電話'), (4, 'メール'), (5, 'その他'); --------------店舗-------------- CREATE TABLE IF NOT EXISTS `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `shop` (`id`, `name`) VALUES (1, '新宿'), (2, '池袋'), (3, '渋谷'), (4, '博多'), (5, '梅田'); --------------来客数-------------- CREATE TABLE IF NOT EXISTS `raikyakusuu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` date DEFAULT NULL, `shop_id` int(2) DEFAULT NULL, `media_id` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; INSERT INTO `raikyakusuu` (`id`, `date`, `shop_id`, `media_id`) VALUES (1, '2013-11-01', 1, 1), (2, '2013-11-01', 1, 1), (3, '2013-11-01', 1, 2), (4, '2013-11-01', 4, 4), (5, '2013-11-01', 1, 2), (6, '2013-11-02', 3, 1), (8, '2013-11-02', 3, 4), (9, '2013-11-02', 2, 2), (10, '2013-11-02', 2, 4), (11, '2013-11-03', 1, 4), (12, '2013-11-03', 3, 1), (13, '2013-11-05', 4, 3), (14, '2013-11-05', 1, 3), (15, '2013-11-06', 2, 2), (16, '2013-11-06', 3, 3), (17, '2013-11-06', 1, 5); select DATE_FORMAT(r.`date`,'%d日') as DayTime, count(*) as cnt, s.`name` as s_name, m.`name` as m_name from raikyakusuu r LEFT JOIN shop s ON s.`id` = r.`shop_id` LEFT JOIN media m ON m.`id` = r.`media_id` WHERE DATE_FORMAT(r.`date`, '%Y-%m') = '2013-11' GROUP BY DayTime, m.`name` 上記のセレクト文で取れた結果をPHPにて 新宿 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 池袋 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 渋谷 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | メール | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | といったようにtableにて表示を考えておりますが、 うまくだせずに困っております。 条件といたしましては、 結果で取れていない媒体、日付も表示させ、cntには0と表示させたいです。 お分かりの方がいらっしゃいましたらご教示お願いいたします。 端折らせていただいている部分も御座いますが、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 時間を自動計算してディフォルトに設定

    以下のようなテーブルを作りたいと思うのですが、 CREATE TABLE hogeTBL ( id bigint(20) NOT NULL AUTO_INCREMENT, product_code varchar(20) NOT NULL default, start_time datetime NOT NULL default '0000-00-00 00:00:00', end_time datetime NOT NULL default '0000-00-00 00:00:00', sub_time datetime NOT NULL default(ここにend_time-start_timeの値を設定したい), PRIMARY KEY (id) ) TYPE=MyISAM; 見たとおり、インサート時、sub_timeのところに自動で end_time - start_time の、差分値が挿入されるようにしたいのですが、構文が思いつきません。 そもそもこういったことはCreate Tableで可能なのでしょうか・・・? サーババージョンは4.1.22です。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • mySQLでのテーブル作成についての質問

    テーブル内の列で Field || Type || Null || Key || Default || Extra ID | int(6) | YES | UNI | NULL | auto_increment と言うテーブルを作成するにはどう記述したら良いのでしょうか? auto_incrementを指定した場合はフィールドにNULLを許可する事は出来ないのでしょうか?

  • PHP+MYSQLで画像のようなイベントスケジュールテーブルがあります

    PHP+MYSQLで画像のようなイベントスケジュールテーブルがあります。 start,endの型はDATETIMEです。当方宿屋なのですが、予約の時点で自動案内メールを 送っています。その中にお泊りのお客様の到着日に合わせたイベントリストを メールの中に入れて案内できるようなスクリプトを作りたいです。 が、到着日だけで検索するのではなく、プラスマイナス2日間くらいも含めて 紹介したいと思っています。願わくばもう一泊という気持ちもありますし。。。 当方で管理しているお客様の到着日は"2010-01-01"という形になっています。 要はpost_idだけ取れればいいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQL + PHP での自動採番

    関連する本を買い込みましたが、全然情報がないのでご助言下さい! 複数テーブルから文字列を抽出してIDを振るような入力フォームを作っています。 具体的には以下のような形を考えているのですが、どのように記述をしてよいのかさっぱりです・・・。 table1: +-----+-------------+------+------+-- | ID0 | ID1 | col1 | col2 | +-----+-------------+------+------+-- | 1 | KW0807-0001 | A | 3323 | | 2 | KX0807-0002 | B | 1122 | | 3 | KY0807-0003 | C | 4441 | | 4 | KW0807-0004 | A | 1256 | +-------------------+------+------+-- table2: +-----+------+------+-- | ID2 | col3 | col4 | +-----+------+------+-- | 1 | A | W | | 2 | B | X | | 3 | C | Y | | 4 | D | Z | +-----+------+------+-- ・ID0 は AUTO INCREMENT ・ID1 -> [K(規定値)] + [col1で入力する値よりcol4を抽出] + 入力した年 (08) + 入力した月 (07) + 0001 から始まる4桁の連番 ・col1, col2の入力と同時に、ID1 を自動で生成、入力 (table2は既存です) ひとまずこんな感じかな・・・と書いてみましたが、全然ダメです。 ID1の入力値は「KResource id #30807-」となってしまいました。 $y = date("y",time()); $m = date("m",time()); $renban = mysql_query(" select col4 from table1 INNER JOIN table2 //LEFT JOINでも可? ON col1.table1 = col3.table2 where '$col1' = col3 "); $ID1 = "K$renban$y$m-0000"; $sql = "insert into table1 values('$ID1', '$col1' '$col2'); ※4桁の連番もどうしてよいか分からないので、ひとまず「0000」としました。 何が足りないのか誤ってるのか・・・ご教授いただければ幸いです。

  • MySQLでinsertした行を取得する

    table t1 id name ------- 1 aaa 2 asv 3 aae といったauto incrementのidを持ったテーブルt1を考えたときに mysql_queryで新規行をinsertした場合にそのidを取得するような ことはできるのでしょうか? phpのmanualを参考にしたところ出来ないような感じのことが書かれて いたのですが,このようなことは頻繁に必要な気もするのですが・・・ 既に考えた案としては ・auto incrementを外して最大のidの1つ上を指定してinsertする ・一度lockしてからinsertして最大のidを取得する というものです もっと1つの関数かなにかでスマートに書けたらいいのですが

    • ベストアンサー
    • PHP
  • MySQL+Perlでの複合処理について

    MySQL5.1.22& Perl5.8の環境にて、とあるサイトの作成(風俗店の従業員出席表)をしております。 MySQL5.1.22& Perl5.8の環境にて、とあるサイトの作成(風俗店の従業員出席表)をしております。 そのサイトで「従業員の出勤時間」(work_start、work_end(time型))をあらかじめセットしておき、現在時刻がその範囲内(つまり出勤中の時間帯)に、該当従業員のprofileテーブルを読み込む処理を行いたいのですが、苦戦しております。 また可能であれば「出勤時間内に、お客様が入った場合に「利用されたプラン(60,90,120など)を「残り時間」として表示させる仕組みについて(MySQLの構文のみで実現可能であれば、その構文、複合的な処理になるのであればその処理方法)をお教えいただければ幸いです。 【全体の流れ】 【スケジュール設定】(営業日当日にサイトへ表示) →【出勤】(出勤中表示) →【サービス開始】( サービス残り時間表示)→【サービス終了】(出勤中表示) →【退勤】(本日は終了の表示) テーブルの内容は下記の通りです。 出勤スケジュールテーブル(schedule) ---------------------------------------------------------------- カラム名|staff_id|work_day |work_start|work_end|service_start|service_end| ---------------------------------------------------------------- 型 | int | date | time | ---------------------------------------------------------------- 内容 | 1 | 2011-06-08|18:00:00 |06:00:00| ** | ---------------------------------------------------------------- 従業員プロフィールテーブル(profile) ---------------------------------------------------------------- カラム名|staff_id| name | 3size |comment | ---------------------------------------------------------------- 型 | int |varchar(15)| varchar(30) | varchar(100) | ---------------------------------------------------------------- 内容 | 1 | 従業員名 |T:150/B:200/W:200/H:200 |従業員コメント | ---------------------------------------------------------------- 複雑なご質問となりすみませんがどなたかご回答お願いいたします。

  • MySQLでのINDEXの貼り方

    MySQLでのINDEXの貼り方にてご教示いただきたく思います。。 現在、ブログサイトを作っていて、記事ID毎にSNSでシェアされた数を保存する仕組みを作っています。 ストレージエンジン = InnoDB を設定しています。 post_idに同じIDが無い場合はINSERTし、ある場合はUPDATEとなります。 検索をかけるSELECT文の想定は以下の2つだと思っています。 SELECT * FROM tablename WHERE post_id = 1234; SELECT facebook FROM tablename WHERE post_id = 5678 作成したテーブル構造は以下になっています。 名前 | データ型 | 属性 | NULL | デフォルト値 | その他 ID | bigint(20) | UNSIGNED | いいえ | なし | AUTO_INCREMENT post_id | bigint(20) | UNSIGNED | いいえ | 0 facebook | bigint(20) | UNSIGNED | いいえ | 0 twitter | bigint(20) | UNSIGNED | いいえ | 0 googleplus | bigint(20) | UNSIGNED | いいえ | 0 pocket | bigint(20) | UNSIGNED | いいえ | 0 pinterest | bigint(20) | UNSIGNED | いいえ | 0 hatena | bigint(20) | UNSIGNED | いいえ | 0 line | bigint(20) | UNSIGNED | いいえ | 0 total | bigint(20) | UNSIGNED | いいえ | 0 datetime | datetime | | いいえ | 0000-00-00 00:00:00 リレーションは行う予定は無いのですが行うかもしれません。 分からないながらもINDEXを設定 ( 添付画像参照 ) してみました。 ご指導ご教示の程よろしくお願いいたします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう