人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでechoなどの出力をした後に、header関数をコールするとPHPエラーが出ます。
PHPマニュアルにも注意を促す記載はありますが、「なぜ」「どのような仕組み」でエラーになるか分かりません。
どなたかエラーになる理由をご解説いただけないでしょうか?
また、session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?
よろしくお願いいたします。

●質問者: sasaki0822
●カテゴリ:インターネット ウェブ制作
✍キーワード:echo PHP エラー マニュアル 解説
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● fonya3
●23ポイント

それはPHPの問題ではなくて、HTTPの問題だからです。

headerは、あくまでもヘッダーなので、HTTPのデータが出力される前に出力する必要があります。

cookieも同じくHTTPのデータに先んじて出力する必要があります。

sessionは結局cookieを使っていますので、setcookieと問題は同じです

◎質問者からの返答

早速のご回答ありがとうございます。

これまで「HTTPのデータ」を意識したプログラミングができていませんでした。

大変勉強になりました。ありがとうございます。


2 ● taroe
●35ポイント ベストアンサー

>session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?

session_startはエラーになりません。エラーなった場合はほかの原因です。

setcookieはその通りです。

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

>「なぜ」「どのような仕組み」でエラー

すでに文字が出力されている状態で

header関数を呼び出すとエラーになるようにPHPが作られてるからです。

なぜエラーになるように作られてるかというと

http通信の仕様で、htmlの本文の前にないと駄目だからです。

エラーにしないと、ヘッダーに書き込んでるつもりがそうでないと気づけないからです。

http://www.tohoho-web.com/ex/http.htm

ほかの言語では、PHPと違ってどこにヘッダーを書いても

先頭にして出力されるので、エラーにする必要がないのです。

PHP言語の仕様です。

◎質問者からの返答

詳細な解説ありがとうございます。

大変勉強になりました。

>ほかの言語では、PHPと違ってどこにヘッダーを書いても

>先頭にして出力されるので、エラーにする必要がないのです。

知りませんでした。。気がききますね。


3 ● にんにん
●22ポイント

専門的用語を使わず簡単に説明していると思ってください。実際の動作の話なだけです。

僕も実際に仕組み自体は理解していませんが、動作としては理解しているつもりです。

headerは全ての出力前に設定しなければなりません。

以下のPHPプログラムはエラーになります。

<?php
echo "test";
header("Location: http://google.co.jp/");

以下であればエラーになりません。(「test」とは表示もされずgoogleに転送されます)

<?php
header("Location: http://google.co.jp/");
echo "test";

僕が思うに、headerはhttp通信の初めにチェックされる部分であり、

「echo」という記述や、「<html>」という記述がhttp通信の一番初めに出力された場合、

それは、HTML文章という判断をしているのだと思います。

それを明確に変更したり、追加要素を加えたい時にheaderが必要になっていると考えてまして、

例えば、以下の文章の場合、文章をPDFとして評価されますし、(「これはPDFです」という文章は表示されるかどうか検証してません)

<?php
header('Content-type: application/pdf');
echo "これはPDFです";

以下の場合は、Not Foundとなり、ページの表示がされません。「これはエラーになります」という文章も表示されないはずです。

<?php
header("HTTP/1.0 404 Not Found");
echo "これはエラーになります";

このように、headerは出力前に指定出来るものです。

headerの後に出力されるものが“何なのか”を明確に出来ます。

Cookieもhttp通信を利用するものだと思います。

◎質問者からの返答

大変分かりやすいご解説ありがとうございます。

反面、HTTP通信について学ぶ必要があると痛感しました。

>「echo」という記述や、「<html>」という記述がhttp通信の一番初めに出力された場合、

>それは、HTML文章という判断をしているのだと思います。

私も同感です。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ