• ベストアンサー

リンクを時間によって表示・非表示にしたい!

プログラミング(超)初心者です。よろしくお願い致します。 PHPを使って、毎週土曜の21時になるとあるリンクが表示され、23時になるとそのリンクが非表示になる、という様なサイトを作りたいのですが、どんなプログラムをすれば宜しいのでしょうか? “○月○日の○時から表示する”といったプログラムは調べてなんとなく分かったのですが、“○時から●時の間だけ”というプログラムが分かりません。。。 よろしくお願い致します!!!

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

  • ベストアンサー
回答No.7

#1です。失礼しました。「土曜」っていう条件があったのですね。 他の回答から、勝手に推測して作ってみました。 動作確認はしましたが、テストはしていません。 <?php //曜日 0:日 ~ 6:土 define("st_weekday", 6); define("ed_weekday", 2); //時間 define("st_time", 2100); define("ed_time", 2259); //開始・終了時間の継続区分 // 0:曜日毎に開始時間・終了時間 // 1:開始曜日開始時間から終了曜日終了時間まで継続 define("time_continuance", 0); //対象曜日かチェック function checkWeekday($wkd) { //開始曜日より終了曜日の方が若い場合 if (st_weekday > ed_weekday) { $ed_wkd = st_weekday + ed_weekday + 1; if ($wkd < st_weekday) $wkd += st_weekday + 1; if ($wkd >= st_weekday and $wkd <= $ed_wkd) return 1; //終了曜日より開始曜日の方が若い場合 } else { if ($wkd >= st_weekday and $wkd <= ed_weekday) return 1; } return 0; } //対象時間かチェック function checkTime($wkd, $time) { //曜日毎に開始・終了する場合 if (time_continuance == 0) { if ($time >= st_time and $time <= ed_time) return 1; //開始曜日開始時間から終了曜日終了時間まで }else { //曜日が開始曜日の場合 if (st_weekday == $wkd) { if ($time >= st_time) { //終了曜日が開始曜日と一致する場合 if (ed_weekday == $wkd and $time <= ed_time) return 1; if (ed_weekday <> $wkd) return 1; } //曜日が終了曜日の場合 } elseif (ed_weekday == $wkd) { if ($time <= ed_time) return 1; //開始曜日開始時間~終了曜日終了時間の間 } else { return 1; } } return 0; } //当日に関する情報の取得 $now = strtotime("now"); $wkd = date("w", $now); $time = date("Hi", $now); //リンクの表示 if (checkWeekday($wkd) == 1) { if (checkTime($wkd, $time) == 1) { echo "対象曜日対象時刻です"; } } ?> 「time_continuance」は1にすると、上記設定値の場合は 土曜21:00から火曜22:59の間、表示し続けます。 リンク先がバレて直接URLが打たれた時、そのページがPHPなら、 同じ制御をすればecho等で「ダメですよ」って出来ます。 ただのHTMLだったり、別のサイトだったりすると流石に制御しきれません。

hakase-chan
質問者

補足

こちらも非常に詳しい情報ありがとうございます!! 今から早速作ってみます!

その他の回答 (6)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.6

#5 です。訂正します。 始めの曜日と終わりの曜日が反対でした。 # 曜日の処理。0:日 ~ 6:土 $st_week = 6; # 始めの曜日(土曜日) $ed_week = 2; # 終わりの曜日(火曜日)

hakase-chan
質問者

お礼

非常に丁寧にありがとうございます! さっそく色々試してみます!!

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.5

何にも考えずに書いたら冗長になってしまいました。 IF分しかないので読んで理解してください。 # 曜日と時間は別処理。 # 曜日の処理。0:日 ~ 6:土 $st_week = 2; # 始めの曜日(土曜日) $ed_week = 6; # 終わりの曜日(火曜日) # 時間の処理 $st_time = "2200"; $ed_time = "1800"; # 曜日が土日をまたぐ場合 if($st_week > $ed_week) { # 該当曜日の判定 if ($st_week <= date("w") or date("w") <= $ed_week) { # 始めと終わりの曜日が重なることはない # 始めの曜日の場合は時間のチェック if ($st_week == date("w")) { # 開始時間を超えているか? if ($st_time <= date("Hi")) { # 書き出し処理 } # 終わりの曜日の場合は時間チェック } elseif ($ed_week == date("w")) { # 終了時間内か? if (date("Hi") < $ed_time) { # 書き出し処理 } # 始めと終わり以外は全日表示 } else { # 書き出し処理 } } # 曜日が土日をまたがない } else { # 該当曜日の判定 if ($st_week <= date("w") and date("w") <= $ed_week) { # 始めと終わりの曜日が同じ場合 # この場合は時間が日付をまたぐことはありえない if ($st_week == $ed_week) { # 時間のチェック if ($st_time <= date("Hi") and date("Hi") < $ed_time) { # 書き出し処理 } # 始めの曜日 < 終わりの曜日 の場合 } else { # 始めの曜日の場合は時間のチェック if ($st_week == date("w")) { # 開始時間を超えているか? if ($st_time <= date("Hi")) { # 書き出し処理 } # 終わりの曜日の場合は時間チェック } elseif ($ed_week == date("w")) { # 終了時間内か? if (date("Hi") < $ed_time) { # 書き出し処理 } # 始めと終わり以外は全日表示 } else { # 書き出し処理 } } } }

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

たとえば20時59分にアクセスした人は、21時過ぎても リンクは表示されません。 メタタグで自ページを定期的に読み直すか、javascript でタイマー処理をするなどが必要になります。 また23時にリンクが非表示になっても、リンク先があれば アクセスされてしまいます。 cronなどで飛び先をリネームしたり、GETやPOSTなどで 飛び先を制御した上で、その時間以降にアクセスが できなくなるような仕組みが必要かもしれませんね

hakase-chan
質問者

補足

そうですよね。折角非表示にしても、アクセスされたんではまったく意味がないですね。 そこだけ手作業でリンク先を止めるってのもなんかアナログで嫌ですし。 出来れば全てプログラムで自動処理できた方がいいですよよね。いやぁ、ほんとに難しい。 ありがとうございます!

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

$date_in = "2100"; $date_out = "2300"; if ($date_in <= date("Hi") and date("Hi") < $date_out) { # 時間範囲内の処理 } else { # 時間範囲外の処理 } 日付をまたぐ場合はもうちょっと工夫が必要。

hakase-chan
質問者

補足

このプログラムは非常に簡単でいいですね^^ では日付をまたぐ場合、例えば土曜22時~火曜18時、のような場合はどうなるんでしょうか。。。?? 一気に複雑になってしまったり (・_・;)

回答No.2

こんな感じでしょうでしょうか。 このスクリプトなら3時と6時など とびとびの時間でも指定できます。 下記のスクリプトでは土日の23時から午前6時まで表示に設定。 テストしたサーバーではタイムゾーンがJSTでした。 サーバーのタイムスタンプを取得しますので サーバー時間がGMTなどの場合は-9時間して調整。 例 サーバーのタイムゾーンがGMTの場合 time() -60*60*9 <? //タイムテーブルの設定 //表示させたい時間の値にonを設定 $arrayTimeTable =array( "0"=>"on", "1"=>"on", "2"=>"on", "3"=>"on", "4"=>"on", "5"=>"on", "6"=>"on", "7"=>"", "8"=>"", "9"=>"", "10"=>"", "11"=>"", "12"=>"", "13"=>"", "14"=>"", "15"=>"", "16"=>"", "17"=>"", "18"=>"", "19"=>"", "20"=>"", "21"=>"", "22"=>"", "23"=>"on", "24"=>"on"); //曜日設定 // 0日 1月 2火 3水 4木 5金 6土 $arrayWeekTable = array( "0"=>"on", "1"=>"", "2"=>"", "3"=>"", "4"=>"", "5"=>"", "6"=>"on", ); $intTimeHourNow = date("G",time()); //現在の時間の時を取得(先頭に0なし) $intWeekNow = date("w",time()); //現在の曜日をを数値で取得 if($arrayTimeTable[$intTimeHourNow]=="on" & $arrayWeekTable[$intWeekNow]=="on"){ //ここに表示させたい内容 echo <<<EOF <a href="http://www.yahoo.co.jp">Yahoo! JAPAN</a> EOF; } ?>

hakase-chan
質問者

補足

さっそくこのソースで作ってみました! ありがとうございます! と、そこで更に三点質問させて下さい!! まず、時間の値の"24"ですが、これは必要なのでしょうか?ここを"on"にすると何時から何時まで表示されるのでしょうか?? そして二点目、このソースの場合、以下の様な処理になると考えて宜しいでしょうか??↓ まず、土曜日になった時点で0時~6時59分までリンクが表示され、7時になった時点で一度消える。 そしてその夜(土曜)23時になったら再びリンクが表示され、そのまま日曜の朝6時59分まで表示し続け、7時になったら再び消える。 そしてまたその夜(日曜)、23時から24時(?)まで表示される。 このような処理をすると考えてよろしいでしょうか?? 土曜の夜23時~日曜の朝7時の間だけリンクが表示されるようにするには、また違ったプログラムになるんですかね。。。 ほんと初心者ですいません。。。 よろしくお願い致します。

回答No.1

当日が何年何月何日だろうが、その情報は必要ないのですから、 無視(決め打ちで2000/01/01などと)してしまって、時間だけを比較すれば良いです。

hakase-chan
質問者

補足

た、例えばどのようなプログラムになりますでしょうかぁ。。。??; すいません。。