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

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

ただいまの
回答率

90.86%

  • PHP

    18174questions

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

phpで時間指定してmeta refreshを実現させる方法を教えてください。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 163

ryu01212008

score 6

 前提・実現したいこと

PHP初心者です。
PHPの構文の中で昼に表示するページと夜に表示するページを変えたいため、
構文を考えています。
うまく挙動しないので、改善する方法があれば教えてください。

【希望】
■8時〜20時は昼用のページ(リダイレクトしない)
■20時〜翌日の8時は夜用のページ(リダイレクトする)

このようなイメージです。

 発生している問題

指定時間以外でも全てリダイレクトしてしまいます。

 該当のソースコード

<?php
date_default_timezone_set('Asia/Tokyo');    
$time = intval(date('H'));
if (0 <= $time && $time <= 8) { // 0時~8時の時間帯のとき ?>
   <meta http-equiv="refresh" content="0; URL=#">    
<?php } elseif (20 <= $time && $time <= 24) { // 20時〜24時の時間帯のとき ?>
   <meta http-equiv="refresh" content="0; URL=#">
<?php } else { // それ以外(=8時〜20時)の時間帯のとき ?>
<?php } ?>

 試したこと

meta refresh以外でもJavaScriptを試しましたが、読み込み速度が遅くなってしまったため
meta refreshで実現したいと考えています。

 試したことソースコード

<?php
date_default_timezone_set('Asia/Tokyo');    
$time = date('G');
$day = date('w')
if ($day == 6 || $day == 0) { 
header('Location: URL');
exit(0);}
elseif (0 <= $time && $time <= 8) { 
header('Location: URL');
exit(0);}
elseif (20 <= $time && $time <= 24) {
header('Location: URL');
exit(0);
}
//それ以外 headerリダイレクト+exitしているのでelseは必要なし
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/04/27 21:14

    ※ クロームはリダイレクトされたということをキャッシュするのでそのページにredirect処理が入ってなくても 勝手にしてくれます(えへっ

    キャンセル

回答 4

+4

まあ mod_rewirte で サービス停止中(503)の設定を使った方がいい気がしないでもないです。

ErrorDocument 503 /maintenance.html

RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{TIME_HOUR} >20 [OR]
RewriteCond %{TIME_HOUR} <08
RewriteRule ^(.*) - [R=503,L]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

いきなりリダイレクトを入れて確認するのではなく、ひとまず任意の文字列を出力して
確実に時間による切り分けができていると確認してから入れられては?
読み込み速度が気になるなら、header()でリダイレクトかけた方が良いと思います。

あとintval()するくらいならdate()時点で頭ゼロがつかないGで時間をとった方が良いかと。

$time = date('G');

 参考コード

質問者さんからご依頼があったのでコードに起こしてみます。
※すみませんが未検証なので、あくまで実装イメージとしてください。

注意点:すべての画面出力(phpでのechoなども含む)より前に書いてください

<?php
date_default_timezone_set('Asia/Tokyo');    
$time = date('G');
if (0 <= $time && $time <= 8) { 
    header('Location: ###0~8時の場合のリダイレクト先');
    exit(0);
}elseif (20 <= $time && $time <= 24) {
    header('Location: ###20~24時の場合のリダイレクト先');
    exit(0);
}
//それ以外 headerリダイレクト+exitしているのでelseは必要なし

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 22:20 編集

    回答ありがとうございます。
    header()でリダイレクトする場合ですと、時間の条件分岐ができないのでこれは厳しいかと考えていました。
    いきなりリダイレクトさせたいのは、個人的な主観で瞬間的に雰囲気が変わったように感じてもらえるようにしたいと考えていたためです。
    夜なら暗く、昼なら明るく・・・といった直感的な感じです。

    キャンセル

  • 2018/04/27 22:21

    なぜできないと?
    html出力する前に時間判断してheader()すればいいだけではないでしょうか?

    キャンセル

  • 2018/04/27 22:24

    metaリダイレクトは実は推奨されてなかったりします。
    https://webtan.impress.co.jp/e/2015/02/13/19305
    更にHTMLを表示した上で(正確にはmetaタグレンダリングのタイミング)でカウントを始めるので、0秒設定でも結構頑張ればリダイレクト前にEscキーで止めることもできたりします。
    header()でリダイレクトすればそのようなことはできませんし301リダイレクトという推奨されているやり方もできます。

    キャンセル

  • 2018/04/27 22:55 編集

    無知のため、大変失礼しました。
    phpの中でもheader()の前に時間の条件分岐の構文を記述したら確実にエラーが出てしまうと勘違いしていました。
    参考までにcodeを記述していただくことは可能でしょうか?

    キャンセル

  • 2018/04/27 23:14

    提示してもらってるページに条件分岐による リダイレクトのサンプルを時間にすればいいのだよ

    キャンセル

  • 2018/04/28 06:15

    実際に試してもらえれば分かりますが、
    http://php.net/manual/ja/function.header.php
    > 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。

    キーワードは「出力」なので
    phpでもechoなりprintなりなんなりで画面に出力することがなければどのような処理を書いていてもheader()のエラーにはなりません。
    コードを書くといっても、今提示されているコードをhtml出力より前に書いてmetaで書いているところをheader()で書くだけにはなりますが・・・
    そのための参考リンクを回答にはったつもりだけではありますが、ひとまず、書いてみます。

    キャンセル

  • 2018/04/28 08:46 編集

    mts10806さん
    大変ご丁寧にありがとうございます。
    こちらの参考リンクで試してみたいと思います。

    キャンセル

  • 2018/04/28 09:42

    回答にコードを追記しているのでそちらも参考に。
    基本的にPHPマニュアルが教科書です。

    キャンセル

  • 2018/04/28 16:33 編集

    参考コードで無事にリダイレクトできました。ありがとうございます。

    ちなみに、土日だけリダイレクトさせる方法を追記してみたのですが、
    そもそも表示されなくなってしまいました。
    正しい方法がお分かりであればご教授ください。
    試したコードは質問欄に追記させていただきました。

    キャンセル

  • 2018/04/28 19:20

    いきなりリダイレクトの記述は書かない方が良いとコメントしてますが…
    PHPのエラー出てませんか?

    キャンセル

  • 2018/04/28 23:06

    すみません。
    一応時間だけのリダイレクトは問題なく動きました!
    問題は土日は終日リダイレクトさせる方法を自分で調べて記述しましたが、
    こちらはエラーが出てしまいました。
    ですので、曜日で条件分岐する方法があれば教えていただきたいです!

    キャンセル

  • 2018/04/29 04:53

    エラー内容が出たのであればエラー内容を載せるのがサイトとしての原則です。
    また、それについて調べた内容も載せましょう。
    あと、実はコードと最初の要件のつじつまが合っていません。
    要件追加がある場合は本来は別質問とすべき内容だったりします。

    というの前置きで次回から気を付けてもらうとして。
    私の19:20の指摘ですでにエラーの可能性をだしていますね?
    コードが実際のものそのままとすれば、曜日分岐のロジックそのものとは関係ないところでのエラーが起きています。
    初学者はよくやってしまいがちなミスですね。頑張って見つけましょう。

    ヒント:PHPコードの文法の末尾はどう締める(ほぼ答えですね)

    あと気になったのは土日は常時リダイレクトさせるということでしょうか?

    ほぼ解決手前で惑わすようなことを提案することになるので申し訳ないのですが、
    そもそも論、リダイレクトする必要があるというところを考え直しても良いかもしれません。
    リダイレクト=URLが変わる ということもあり、同じような機能を持つページで
    少し色が変わるとかそういうレベルであればte2jiさんの仰るようにリダイレクトではなく、
    ページ自体のファイルの読み替えとか、CSSの読み替えだけで 切り替えるようにするほうが
    いいように思います(要件次第です) 今回の対応後で結構ですので、ご検討ください。

    キャンセル

0

リダイレクトではなく、View を時間によって読み分けるのが良いかと。
require で、読むファイルを条件分岐すると実現できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/28 10:19

    https://support.google.com/webmasters/answer/181708?hl=ja
    これと同じことがいえる気がするんだが

    キャンセル

  • 2018/04/28 10:46

    サーチエンジンへの対応方針で、どの方式を選択すべきかちゃんと設計しないといけなさそうですね。

    この回答のイメージは、このページ自体はインデックスさせない感じです。
    ダイレクトアクセス対応ですね。

    キャンセル

0

質問主さんのコードで、時間を変えて試して見たけどちゃんと機能するようです。
もちろん他の方法でできているなら問題ないですが、何が原因だったのだろう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18174questions

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