-1

この質問が以前に何度も投稿されたことは知っていますが、エラーが本来の動作をしていないため、とにかく良い答えを見つけることができませんでした.

ご覧のとおり、次のようなコードがあります。

<?php
    include("banner.php");
    include("menu.php");
    print "<div class=\"wrapper\">";
        if(true) header("Location:index.php");
        else print "Hello World";
    print "</div>";
    include("footer.php");
?>

banner.php次のようになります。

<div id=banner><a href=index.php><img src=img/banner.png></a></div>

次のようになりmenu.phpます。

<ul class="menu">
    <li class="dropdown">Menu
        <ul>
            <a href="test1.php?id=<?php print $id; ?>"><li>Item 1</li></a>
            <a href="test2.php?"><li>Item </li></a>
            <a href="test3.php"><li>Item 3</li></a>
            <a href="test4.php?id=<?php print $id; ?>"><li>Item 4</li></a>
        </ul>
    </li>
</ul>

にはいくつかの PHP 要素があることに注意してくださいmenu.php

最初のコードを実行すると、エラーが発生しますWarning: Cannot modify header information - headers already sent by (output started at /var/www/menu.php:10) in /var/www/test.php on line 5。10行目menu.phpは最後の行です。コードからメニューを完全に削除してそのままにしておくbanner.phpと、コードは正常に動作します。メニューを含めた直後banner.phpの行と同様に、出力も提供するため、これは紛らわしいと思います。print "<div class=\"wrapper\">";

私の質問は単にこれです:なぜmenu.phpエラーが発生するのに、banner.phpそうでないのですか?

4

3 に答える 3

1

これは、出力がバッファリングされていて、最後の行でmenu.phpバッファがいっぱいになり、ワイヤにフラッシュされた場合に発生します。

于 2013-07-21T11:45:19.447 に答える
0

ヘッダーを変更する PHP は、出力バッファリングをオンにしていない限り、他のページ データの前に配置する必要があります。ANYTHINGを出力すると、ヘッダーが正しく送信されます。HTMLコード、PHPなど..

PHP コードをファセットと考えてください。Web サーバーはガラスです。ガラスを HTML の出力で満たすことを想像してみましょう。最初のドロップを取得するとすぐに、送信しようとしているヘッダーがすでに確立されています。

PHP.ini で出力バッファリングをオンにすることができます。

基本的に出力バッファリングは、PHP コードで計量カップを満たし、特定のポイントに達するとガラス カップ (Web サーバー) に注がれる計量カップのようなものです。構築中ですが、まだ PHP でアクセスできるため、Web サーバーに何も渡していないヘッダーを変更できます。ただし、これはサーバーのパフォーマンスに影響を与えることに注意してください。あなたはおそらくそれに気付かないでしょう。

于 2013-07-21T11:45:14.237 に答える
0

HTTPHeader を最初に送信する必要があります。また、スクリプトからのすべての出力 (1 文字またはエラー メッセージであっても) は、HTTP ヘッダーによって処理されます。コンテンツの送信が開始されると、追加のヘッダーを送信できなくなります。これは HTTP プロトコルの基本です。あなたのコードのWRTについて説明します。

<?php
    include("banner.php");
    //The above line the banner output is sent.So does the HTTP Headers
    include("menu.php");
    print "<div class=\"wrapper\">";
        if(true) header("Location:index.php");
        //Because the Output is started in bannrd you cannot send additional headers.
        else print "Hello World";
    print "</div>";
    include("footer.php");
?>

php.ini で出力バッファリングを有効にしている場合、バッファリングされずheaders、コンテンツがバッファリングされるだけであるため、予期しない結果が発生する可能性があります。あなたの場合、php がバナー コードをフラッシュする前にヘッダーを送信したようです。

于 2013-07-21T11:51:36.513 に答える