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

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

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

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

Q&A

解決済

4回答

1212閲覧

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

ryu01212008

総合スコア26

PHP

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

0グッド

0クリップ

投稿2018/04/27 12:07

編集2018/04/28 07:30

前提・実現したいこと

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

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

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

発生している問題

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

該当のソースコード

php

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

試したこと

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

試したことソースコード

php

1<?php 2date_default_timezone_set('Asia/Tokyo'); 3$time = date('G'); 4$day = date('w') 5if ($day == 6 || $day == 0) { 6header('Location: URL'); 7exit(0);} 8elseif (0 <= $time && $time <= 8) { 9header('Location: URL'); 10exit(0);} 11elseif (20 <= $time && $time <= 24) { 12header('Location: URL'); 13exit(0); 14} 15//それ以外 headerリダイレクト+exitしているのでelseは必要なし 16?>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/27 12:14

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

回答4

0

まあ 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]

投稿2018/04/27 12:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

php

1$time = date('G');

# 参考コード

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

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

php

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

投稿2018/04/27 12:36

編集2018/04/28 19:48
m.ts10806

総合スコア80842

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryu01212008

2018/04/27 13:20 編集

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

2018/04/27 13:21

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

2018/04/27 13:24

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

2018/04/27 13:55 編集

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

退会済みユーザー

2018/04/27 14:14

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

2018/04/27 21:15

実際に試してもらえれば分かりますが、 http://php.net/manual/ja/function.header.php > 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。 キーワードは「出力」なので phpでもechoなりprintなりなんなりで画面に出力することがなければどのような処理を書いていてもheader()のエラーにはなりません。 コードを書くといっても、今提示されているコードをhtml出力より前に書いてmetaで書いているところをheader()で書くだけにはなりますが・・・ そのための参考リンクを回答にはったつもりだけではありますが、ひとまず、書いてみます。
ryu01212008

2018/04/27 23:46 編集

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

2018/04/28 00:42

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

2018/04/28 07:33 編集

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

2018/04/28 10:20

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

2018/04/28 14:06

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

2018/04/28 19:53

エラー内容が出たのであればエラー内容を載せるのがサイトとしての原則です。 また、それについて調べた内容も載せましょう。 あと、実はコードと最初の要件のつじつまが合っていません。 要件追加がある場合は本来は別質問とすべき内容だったりします。 というの前置きで次回から気を付けてもらうとして。 私の19:20の指摘ですでにエラーの可能性をだしていますね? コードが実際のものそのままとすれば、曜日分岐のロジックそのものとは関係ないところでのエラーが起きています。 初学者はよくやってしまいがちなミスですね。頑張って見つけましょう。 ヒント:PHPコードの文法の末尾はどう締める(ほぼ答えですね) あと気になったのは土日は常時リダイレクトさせるということでしょうか? ほぼ解決手前で惑わすようなことを提案することになるので申し訳ないのですが、 そもそも論、リダイレクトする必要があるというところを考え直しても良いかもしれません。 リダイレクト=URLが変わる ということもあり、同じような機能を持つページで 少し色が変わるとかそういうレベルであればte2jiさんの仰るようにリダイレクトではなく、 ページ自体のファイルの読み替えとか、CSSの読み替えだけで 切り替えるようにするほうが いいように思います(要件次第です) 今回の対応後で結構ですので、ご検討ください。
guest

0

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

投稿2018/04/28 02:30

kobayashitomoya

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/04/28 01:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/28 01:46

サーチエンジンへの対応方針で、どの方式を選択すべきかちゃんと設計しないといけなさそうですね。 この回答のイメージは、このページ自体はインデックスさせない感じです。 ダイレクトアクセス対応ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問