web-dev-qa-db-ja.com

PHPエラー:ヘッダー情報を変更できません–ヘッダーは既に送信されています

重複の可能性:
ヘッダーはすでにPHPによって送信されています

だから私は私のページにこの出力を持っています..なぜ私がそれをポップアップさせるのか理解していません。 phpは初めてなので、簡単に修正できるかもしれません。

-すべての重要な情報を含むheader.phpファイルと、ページのバナーがあります。このheader.phpはすべてのページに含まれています。

-セッション値をチェックして、ユーザーが特定のページにアクセスできることを確認します。ユーザーがそこにいることを許可されていない場合、私はユーザーをログインページにキックバックします

ただし、ここでエラーが発生します。これは私が持っているものです:

include_once ("header.php");

if ($_SESSION['uid']!='programmer')
{                        
header('Location: index.php');
echo 'you cannot be here';
exit;
}   

リダイレクト先のインデックスにもヘッダーがあります。では、これらの複数のヘッダー参照があると、このエラーが発生しますか?私はこれを行う他の方法を見ていません、そしてそれは私を狂わせています!

11
Marcus

テキストがブラウザに出力されると、header()を使用できなくなります。 _header.php_ includeはおそらくHTMLを出力するため、header()は使用できません。

これはいくつかの方法で解決できます。

  • Ifステートメントをヘッダーインクルードの上に移動します(コメントで_header.php_がuidセッションやその他の重要なものを設定することを示しているため、これは機能しません)。
  • スクリプトの先頭でob_start()を呼び出して、出力をバッファリングします。
32
ceejayoz

Header.phpファイルに「バナーがある」場合は、おそらくHTMLコンテンツをページに出力しています。

コンテンツを出力した後は、HTTPヘッダーを発行できません。

6
Quentin

他のコンテンツを送信した後にヘッダーを送信することはできません。非常に可能性の高い原因は、閉じた後の余分な空白です?>header.phpのタグ。通常、スクリプトのみのphpファイルでは終了タグを完全に省略することをお勧めします。

エラーは、どの行(およびどのファイル)が出力を送信しているかを正確に示しているはずです。

6
keithjgrant

了解しました。修正されました。どうすればよいかわかりませんが、なぜこれが突然機能するのかを誰かが説明できるかもしれません。

これは私のコードです:

include_once ("header.php");

if ($_SESSION['uid']!='programmer') {  
    if(isset($_SESSION['uid'])) {
        echo $_SESSION['uid'];
    }                           

    header('Location: index.php');
    exit;
}

繰り返しますが、これですべて機能します。 PHP ...なぜ今働いているのですか?

1
Marcus

以前は次のようなリダイレクト機能に関して、同様のエラーが発生しました(これもどこからともなく発生しているようです)。

_function Redirect($url) {
        flush(); // Flush the buffer
        header("Location: $url"); // Rewrite the header
        die;
    }
_

どうやら、古いヘッダーを完全にフラッシュするには、ob_flush();も追加する必要があります。新しい関数は次のとおりです。

_function Redirect($url) {
        flush(); // Flush the buffer
        ob_flush();
        header("Location: $url"); // Rewrite the header
        die;
    }
_

これがこの問題を抱えている他の誰かに役立つことを願っています!

1
citizenen