- ベストアンサー
A月11日~B月10日期間内を表示する方法と、ログ表示
毎日の出席状況をまとめるデータベースを作っているのですが、現在やりたいことが二つあります。 1.A月11日~B月10日の期間内を表示させる方法。 現在は登録されたもの全てブラウザ上で見られるようになっているのですが、 この状態から、今月分として1月11日~2月10日までを表示させて、2月11日以降から2月11日~3月10日までを表示させたい。 2月11日を過ぎると1月分は表示させず、下記のプルダウンメニューで参照出来るようにしたいと思っています。 2.プルダウンメニューで2006年A月、2006年B月、2006年C月・・・と表示していて、 例えば2006年B月を選択すると、B月11日~C月10日分を表示できるようする方法。 以上の事はPHPで実現可能なのでしょうか。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私も以前年月日をデータベースの別フィールドで登録していてPHP側で日付の絞込みをしたことがあります。 その時のやり方は以下のようなものでした。 ※他にもっといい方法があるかもしれません。 ------------------------------------------------------- $s_yy = "検索開始年"; $s_mm = "検索開始月"; $s_dd = "検索開始日"; // 検索開始年月日のタイムスタンプの取得 $s_timestamp = mktime(0, 0, 0, $s_mm, $s_dd, $s_yy); $e_yy = "検索終了年"; $e_mm = "検索終了月"; $e_dd = "検索終了日"; // 検索終了年月日のタイムスタンプの取得 $e_timestamp = mktime(0, 0, 0, $e_mm, $e_dd, $e_yy); while(レコード数分ループ) { $d_yy = "データベースの年"; $d_mm = "データベースの月"; $d_dd = "データベースの日"; // レコードのタイムスタンプの取得 $d_timestamp = mktime(0, 0, 0, $d_mm, $d_dd, $d_yy); // 検索開始年月日より前なら表示しない if($s_timestamp > $d_timestamp) continue; // 検索終了年月日より後なら表示しない if($d_timestamp > $e_timestamp) continue; /* 該当レコードなので表示する */ } ------------------------------------------------------- イメージとしてはこのようなものです。 【 参考:http://jp.php.net/manual/ja/ref.datetime.php 】 time(): 現在の時間を1970年1月1日 00:00:00からの通算秒で取得する mktime(時間, 分, 秒, 月, 日, 年): 指定時間を1970年1月1日 00:00:00からの通算秒で取得する ※ただし、mktime()には使用できる有効範囲があります。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
#3です。コピペミスがあったのでもう一度。 <?PHP $today=mktime(); $today=mktime(0,0,0,1,1,2005); if($_GET['theDay']==""){ $theDay= $today; }else{ $theDay=strtotime($_GET['theDay']); } $startDay=mktime(0,0,0,date("m",$theDay),11,date("Y",$theDay)); $endDay=mktime(0,0,0,date("m",$theDay)+1,10,date("Y",$theDay)); if (date("d",$theDay)<11){ $startDay=strtotime("-1 month",$startDay); $endDay=strtotime("-1 month",$endDay); } print "SELECT * FROM `hoge` WHERE `date` BETWEEN `".date("Y/m/d",$startDay)."` AND `".date("Y/m/d",$endDay)."`"; print "<hr>"; print "<form action='$PHP_SELF' method='get'>"; print "<select name='theDay'>\n"; for ($i=0;$i<12;$i++){ print "<option value=\"" .date("Y/m/d",mktime(0,0,0,date("m",$today)-$i,11,date("Y",$today)))."\">" .date("Y年m月",mktime(0,0,0,date("m",$today)-$i,11,date("Y",$today))) ."<br>\n"; } print "</select>\n"; print "<input type='submit' value='send'>"; print "</form>"; ?>
お礼
yambejpさんこんにちは。 有用なサンプルを載せて頂きありがとうございました。 こちらも理想どおりの結果が出ていて、このような方法もあるのかと勉強させられました。 じっくりと参考にさせていただきたいと思います。 今回はどうもありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
とりあえずこんな感じでしょか? mktimeとstrtotimeさえわかればPHPなら日付操作は 柔軟です。 <?PHP header("Content-Type:text/html;charset=euc-jp"); $today=mktime(); $today=mktime(0,0,0,1,1,2005); if($_GET['theDay']==""){ $theDay= $today; }else{ $theDay=strtotime($_GET['theDay']); } $startDay=mktime(0,0,0,date("m",$theDay),11,date("Y",$theDay)); $endDay=mktime(0,0,0,date("m",$theDay)+1,10,date("Y",$theDay)); if (date("d",$theDay)<11){ $startDay=strtotime("-1 month",$startDay); $endDay=strtotime("-1 month",$endDay); } print "SELECT * FROM `hoge` WHERE `date` BETWEEN `".date("Y/m/d",$startDay)."` A print "<hr>"; print "<form action='$PHP_SELF' method='get'>"; print "<select name='theDay'>\n"; for ($i=0;$i<12;$i++){ print "<option value=\"" .date("Y/m/d",mktime(0,0,0,date("m",$today)-$i,11,date("Y",$today)))."\">" .date("Y年m月",mktime(0,0,0,date("m",$today)-$i,11,date("Y",$today))) ."<br>\n"; } print "</select>\n"; print "<input type='submit' value='send'>"; print "</form>"; ?>
- papillon68
- ベストアンサー率61% (42/68)
kakapoさんはじめまして、papillon68と申します。 データベースを使われるので、日付型で登録してSQLにより検索する方法やPHPにより絞込みを行う方法など で絞込みは行えます。 SQLでの絞込みは使っているデータベースにより文法が違ったりするので注意する必要があると思います。 http://www.sound-uz.jp/php/bbs/index.php?mode=topic&num=2672 PHPでの絞込みでは日付・時刻関数を使います。 http://jp.php.net/manual/ja/ref.datetime.php
お礼
こんにちはpapillon68さん。 解りやすい解説ありがとうございました。 やり方はかなり理解できました。 あつかましくもう一つ質問があるのですが、 SQLでは日付をそれぞれday1(年)、day2(月)、day3(日)というフィールドに分けて格納しています。 今回紹介させていただいたサイトを参考にして、 PHPで絞込みをしようと思っているのですが、 SQLではバラバラに日付を格納しているため、 PHPで処理する際に日付としてどうまとめたらいいのか困っています。 すごく初歩的な問題なのかもしれませんが、よろしければご教授いただきたいと思っています。
お礼
素早いレスと、わざわざサンプルまで載せて頂いてありがとうございました! 無事希望通りの結果を表示させることが出来ました。 今回は何度もお付き合いいただいてありがとうございました。