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

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

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

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

Q&A

解決済

1回答

822閲覧

サーバー側で問題がなければ別のページにリダイレクトさせる

SugiuraY

総合スコア317

PHP

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

0グッド

0クリップ

投稿2018/09/25 15:27

編集2018/09/25 16:05

現在PHPで以下のようなコードを書いております、実行したい処理としては下記の1-3の流れになります。

  1. POSTで値を受け取った (true)
  2. バリデーションチェック_値が入力されている (true)
  3. https://www.xxx.xxx.xxx/にリダイレクト

1)がfalseであれば、甲が出力されます
2)がfalseであれば、乙が出力されます

もちろんheader関数では事前にhtmlコードや空白を出力してはいけないと認識しているので
下記のコードは動作しないと理解しているのですが、とすればサーバーサイドでリダイレクトさせるためには
他に術があるのでしょうか?

アドバイスをいただければ幸いです。
よろしくお願い致します。

PHP

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7<?php if($_SERVER ['REQUEST_METHOD'] === 'POST'):?> 8 <?php if(isset($_POST['content'])):?> 9 <?php 10 header('Location:https://www.xxx.xxx.xxx/'); 11 exit; 12 ?> 13 <?php else:?> 14<!--乙--> 15 <body> 16 <form action="" method="post"> 17 <input type="text" name="content"> 18 <input type="submit" name="post"> 19 </form> 20 <p>入力をしてください</p> 21 </body> 22<!--乙--> 23 <?php endif;?> 24<?php else:?> 25 <!--甲--> 26 <body> 27 <form action="" method="post"> 28 <input type="text" name="content"> 29 <input type="submit" name="post"> 30 </form> 31 </body> 32 <!--甲--> 33<?php endif;?> 34</html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/25 15:33

提示されたコードは構文エラーがありますが、これは手元のコードと同一のものですか?
SugiuraY

2018/09/25 15:38

Kosuke_Shibuya様、ご指摘ありがとうございます。最後のendif;が欠落していたので、修正をさせていただきました。大変失礼いたしました。
退会済みユーザー

退会済みユーザー

2018/09/25 15:40

POSTで受け取るコードになっていますが、form に method="post" が指定されていませんが、記述ミス?
SugiuraY

2018/09/25 15:57

改めてactionを含めて属性を再記述いたしました。お詫び申し上げます。
退会済みユーザー

退会済みユーザー

2018/09/25 15:58

formはもう一箇所ありますよ。
guest

回答1

0

ベストアンサー

header() はいかなる文字も出力する前に使用します。

http://php.net/manual/ja/function.header.php

イメージ説明

php

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5$err = []; 6if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { 7 if (filter_input(INPUT_POST, 'content') == "") { 8 $err[] = "入力をしてください"; 9 } 10 if (count($err) === 0) { 11 header('Location:https://www.xxx.xxx.xxx/'); 12 } 13} 14?><!DOCTYPE html> 15<html lang="ja" dir="ltr"> 16 <head> 17 <meta charset="utf-8"> 18 <title></title> 19 </head> 20 <body> 21 <form method="post"> 22 <input type="text" name="content"> 23 <input type="submit" name="post"> 24 </form> 25 <?php foreach ($err as $e): ?> 26 <p><?php echo $e; ?></p> 27 <?php endforeach; ?> 28 </body> 29</html>

投稿2018/09/25 15:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SugiuraY

2018/09/25 16:04

Kosuke_Shibuya様 ご回答を賜り、誠にありがとうございます。 header関数はいかなる文字を出力する間に使用しなくてはならないというのはHTML上の話だったのですね、初心者で大きな誤解をしておりました。その前にphpコードを書くこともできないと思っていたので、どうやってリダイレクトができないと格闘しておりました。 ご指摘の方法で、無事動作することはできましたが、HTMLのheaderの仕組みとこれをPHP上操作する関数について、この機会にもっと調べてみようと思います。 夜分にもかかわらず、お力添えに改めて御礼を申し上げます。
退会済みユーザー

退会済みユーザー

2018/09/25 16:08

「大きな誤解をしておりました」何をよんで?誤解していたのでしょう? なにかブログ的なものを読んでそう、誤解していたのでしょうか?
SugiuraY

2018/09/25 16:15

マニュアルには以下のような記載がございました。 <html> <?php /* これはエラーとなります。この上に出力があることに注目してください。 * それはheader()のコールより前であるということになります */ header('Location: http://www.example.com/'); exit; ?> これをそのまま解釈すると、header関数の前にphp上のコメントアウトすら認めらないため、header関数は常にhtmlでの文字列ややどのphpコードよりも先立って出現しなければならない、とすれば事前にphpコードもかけずにどうやってそもそも分岐してheader関数でリダイレクトを使用するのか。。。?という疑問に陥っておりました。
退会済みユーザー

退会済みユーザー

2018/09/25 16:18 編集

「すべての実際の出力の前に」と書かれていますよ。 例では、<?php の前に <html> が出力されますよね?
SugiuraY

2018/09/25 16:26

その点はおっしゃる通りなのです。間違いなく、header関数のhtmlコードが記載されてはいけないことを理解することができました。 もしかしたら常識的な問いかもしれないのですが、 プログラムで特に断りがなく「出力」と表現される場合には、html上何かを記述されることを指すのでしょうか?例えばマニュアルにある以下の文言はhtmlではなくphp上のコメントアウトにかかわらず、なぜこれもエラーになるのかが分からずに、マニュアルで混乱しておりました。。 /* これはエラーとなります。この上に出力があることに注目してください。 * それはheader()のコールより前であるということになります */ このコメントアウトはhtmlとはなんら関係のないコードのはずなのになぜと考えを巡らせておりました。。確かにheaderの取り扱いはあくまでhtmlやhttp処理の問題なのでphpコードが書かれていることとは関係がないのではと思っているのですが。
退会済みユーザー

退会済みユーザー

2018/09/25 16:28

Ctrl(MacならCommand) + U でソースコードがブラウザ上で出力されますよね? ここに表示されるのが「出力」です。
SugiuraY

2018/09/25 16:49

理解いたしました、ユーザーにも可視化されているソースコードが一般的に「出力」されたものと解釈するのですね。正直に申し上げると、マニュアルの書きぶりは腹落ちしない部分もあるのですが、今はおっしゃる通りに理解してみようと思います。
退会済みユーザー

退会済みユーザー

2018/09/25 16:57

マニュアエウの言っている意味がわかりにくいなーって思う場合、原文の英語のマニュアルを読むと良いですよ。
SugiuraY

2018/09/25 23:04

ありがとうございます、そうですね、そのようなアプローチでまた気持ちを入れ替えて 読んでみます。 稚拙なご質問であったかもしれませんが、お力添えをいただき、本当にありがとうございました。 よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問