0

session_start() のようなヘッダー情報を変更する関数と、「ヘッダーを変更できません」または「セッション キャッシュ リミッターを送信できません」という警告を生成する header() 関数の制限と、その理由と解決策を認識しています。PHP の「Headers already sent」エラーを修正する方法

私が知りたいのは、これらのエラーが発生したときに、php タグまたは HTML 出力の START の前に空白がないのはなぜですか? 通常、エラーは、ヘッダー関数の呼び出しの前に発生する HTML 出力の大きなブロックの途中で発生します。

これらの場合、警告を受け取る前に、未加工の HTML 出力の後、ヘッダー関数が実際に機能します。しかし、ある時点で、何かを変更するか、何かを追加すると、警告が表示され始めます。これは通常、多くの HTML 出力の後のスポットを指します。

これは、私が出力しているHTMLが通常、ある時点まで自動的にバッファリングされている(ob_start()が問題を解決する)と思わせます。その後、何かが出力を引き起こします。

私の header.php ファイル:

<!DOCTYPE html>

<html lang="en">
<?php
    header("Cache-Control: no-cache, must-revalidate");
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>    
    <head>
        <!-- style sheets and includes here -->
    </head>

    <?php

    session_start();
    //error_reporting(0);

    // some PHP code here for user checking / cookies

    ?>

    <body>
        <!-- some additional html here -->

    <?php include("resources/main-nav.php"); ?>

別のファイルで:

<?php

include('pathto/header.php')


//This line works for a while and then stops, producing
// the "Warning: cannot modify headers" line

// The warning that this call produces names a line around 100
// inside the "main-nav.php" file

header('Location: index.php');

?>

このエラーが発生する場合は、DOCTYPE タグの header.php の先頭で発生するはずですが、かなりの量の HTML があり、出力は main- で始まると示されています。 nav.php.

理由を知りたいです。

ありがとう!

4

1 に答える 1

2
<!DOCTYPE html>         <---this is output
                        <---this is output
<html lang="en">        <---this is output
<?php
    header("Cache-Control: no-cache, must-revalidate");

を呼び出そうとした時点ですでに出力が完了しているため、「headers already sent」が表示されますheader()header()呼び出しは、コードからの出力の前に来なければなりません

<?php
    header("Cache-Control: no-cache, must-revalidate");
?>
<!DOCTYPE html>         <---this is output
                        <---this is output
<html lang="en">        <---this is output

うまくいくだろう

于 2013-09-20T15:54:57.340 に答える