困っていること
初歩的な問題かもしれませんが、ご教示願いたいです。
phpで記述した処理の分岐処理の確認をしたくて
phpでrequire_onceを用いて外部ファイルを読み込むと、そのあとに記述したechoが表示されません。
require_onceの前に記述したechoは正常に出力されますし、エラー表示もでてきません。
require_onceの部分をコメントアウトすると表示がうまくいくのですが、
何が影響しているのでしょうか?
調べてもそのような事例が出てこず、困っています。
今まで自分が書いてきたコードでもrequire_onceを用いたものはありますが、処理が行われない(行われているが表示されない?)ことはありませんでした。
単純に出力だけを行うことがなかったので気づかなかったのかもしれませんが…
ご存知の方がいらっしゃいましたら回答いただけると幸いです。
ソースコード
記述途中で見づらいですがご容赦ねがいます。
php
1<?php 2 3 ini_set( 'display_errors', 1 ); 4 5 print "hi"; 6 7 8 require_once('./MainController.php'); 9 require_once('./DetailController.php'); 10 require_once('./SearchController.php'); 11 require_once('./AnslistController.php'); 12 require_once('./OblistController.php'); 13 require_once('./ReportlistController.php'); 14 require_once('./BanwordlistController.php'); 15 16 17 18 /* $getdata = $_GET["c"]; */ 19 $getdata="Banwordlist"; 20 print "HI"; 21 22 if(strstr($getdata,'Main')==true){//質問一覧取得 23 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 24 header('Location: ' . $url, true, 301);//httpレスポンスのヘッダー 25 exit;//全ての出力を終了 26 }else if(strstr($getdata,'Detail')==true){//詳細一覧取得 27 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 28 header('Location: ' . $url, true, 301);//httpレスポンスのヘッダー 29 exit;//全ての出力を終了 30 }else if(strstr($getdata,'Search')==true){//検索一覧取得 31 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 32 header('Location: ' . $url, true, 301);//httpレスポンスのヘッダー 33 exit;//全ての出力を終了 34 }else if(strstr($getdata,'Anslist')==true){//回答者一覧取得 35 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 36 header('Location: ' . $url, true, 301);//httpレスポンスのヘッダー 37 exit;//全ての出力を終了 38 }else if(strstr($getdata,'Oblist')==true){//監視者一覧取得 39 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 40 header('Location: '. $url, true, 301);//httpレスポンスのヘッダー 41 exit;//全ての出力を終了 42 }else if(strstr($getdata,'Reportlist')==true){//通報一覧取得 43 $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 44 header('Location: '. $url, true, 301);//httpレスポンスのヘッダー 45 exit;//全ての出力を終了 46 }else if($getdata=="Banwordlist"){//禁止ワード一覧取得 47 /* $url = './Controller/'. $getdata .'Controller.php';//リダイレクト先URLの指定 48 header('Location: '. $url, true, 301);//httpレスポンスのヘッダー */ 49 echo "Hi"; 50 //$test=new $BanwordlistController(); 51 //$test->Banwordlist(); 52 exit;//全ての出力を終了 53 }else{ 54 header("HTTP/1.0 404 Not Found");//404エラーを返す 55 exit; 56 } 57 58 59 60?>
require_onceで読み込まれているPHPがそれぞれ何をしているのか全て提示いただかないと何とも言えません。 requireの前は出力される、そのあとは出力されないとなるとどこかでexit()なりdie()なりで処理が終了しているのかもしれませんが、提示内容からはわかりません。まずは1つずつコメントアウトしていってどこが原因か確かめてみては?
あと、header()の前には何も画面出力してはいけませんので、そのあたりを見直してみてください。
コメントありがとうございます。読み込みにしていたファイル全てechoだけを記述したダミーを用意していたつもりなのですが、1番上のファイルだけダミーファイルではなくexit()が使用されているファイルでした…。解決しましたありがとうございます!!読み込みの段階でも読み込まれたファイルのプログラムが影響するようになっているのですね、それは初めて知りました。header()の前には画面出力してはいけないとのことですが、どこの部分でしょうか?少し理解できなくてすみません。
http://php.net/manual/ja/function.header.php >覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。
print しちゃってますよね。header()の前に。
リファレンスだけでは少しかみ砕けなかったので他のサイトも閲覧してきました(汗なるほど、httpの仕様上やってはいけないことだったのですね。こちらも初めて知りました。学校で教わることがない事ばかりで改めて勉強不足を痛感致しました。ご丁寧にコメントやアドバイスありがとうございました!解決しましたので、閉じさせていただきますね。本当にありがとうございました。
ただ、本件は解決したようですし、私のコメントで解決したようでしたらほぼそのまま回答にしておきますので解決済みにして次にいきましょう。
学校でどのような内容を教わるか学校でPHPを教わったことがないのでわかりませんが、プログラミング言語にとっての教科書は公式マニュアル・ドキュメントです。PHPマニュアルは内容も細かいですし私としては読みやすいですし、ユーザー同士の意見交換もなされていたりして確実な情報が必ず載っているものです。何かあったら必ずPHPマニュアルで仕様を確認して検証していくようにしてください。
回答2件
あなたの回答
tips
プレビュー