1. ホーム
  2. php

[解決済み] 警告 Cannot modify header information - headers already sent by ERROR [duplicate] ヘッダー情報を変更できません。

2023-05-14 18:48:06

質問

以前からこのエラーに悩まされています。

そもそも、空白のせいだとばかり思っていたのですが、さらに調べてみると、これと似たような問題かもしれません。

このヘッダー ステートメントの前に、ユーザーに出力を送信する可能性のあるステートメントがないか探してください。1 つ以上見つかった場合は、ヘッダー ステートメントをそれらの前に移動するようにコードを変更します。複雑な条件文は問題を複雑にするかもしれませんが、問題の解決に役立つかもしれません。PHPスクリプトの先頭で、できるだけ早くヘッダーの値を決定し、そこに設定するような条件式を考えてみましょう。

header()と共にincludeヘッダーが問題を引き起こしていると推測されますが、このエラーを取り除くためにコードをどのように並べ替えたらよいのかわかりません。

どうすればこのエラーを取り除くことができますか?

<?php
    $username = $password = $token = $fName = "";

    include_once 'header.php';

    if (isset($_POST['username']) && isset($_POST['password']))
        $username = sanitizeString($_POST['username']);

    $password = sanitizeString($_POST['password']); //Set temporary username and password variables
    $token    = md5("$password"); //Encrypt temporary password

    if ($username != 'admin')
    {
        header("Location:summary.php");
    }
    elseif($username == 'admin')
    {
        header("Location:admin.php");
    }
    elseif($username == '')
    {
        header("Location:index.php");
    }
    else
        die ("<body><div class='container'><p class='error'>Invalid username or password.</p></div></body>");

    if ($username == "" || $token == "")
    {
        echo "<body><div class='container'><p class='error'>Please enter your username and password</p></div></body>";
    }
    else
    {
        $query = "SELECT * FROM members WHERE username='$username'AND password = '$token'"; //Look in table for username entered
        $result = mysql_query($query);
        if (!$result)
            die ("Database access failed: " . mysql_error());
        elseif (mysql_num_rows($result) > 0)
        {
            $row = mysql_fetch_row($result);
            $_SESSION['username'] = $username; //Set session variables
            $_SESSION['password'] = $token;

            $fName = $row[0];
        }
    }
?>

どのように解決するのですか?

長期的な答えは、PHPスクリプトからのすべての出力は、変数にバッファリングされるべきであるということです。これにはヘッダーと本文の出力が含まれます。そして、スクリプトの最後に、必要な出力を行います。

あなたの問題に対する非常に迅速な解決策は、PHPスクリプトに

ob_start();

をスクリプトの一番最初に追加してください。もし、すべてのスクリプトで必要であれば、header.phpファイルの一番最初に追加してください。

これは、PHP の出力バッファリング機能を有効にします。PHP では、何かを出力する (echo や print を実行する) ときに、HTTP ヘッダを送信しなければなりません。出力バッファリングを有効にすると、スクリプトで出力することができますが、PHPはバッファがフラッシュされるまでヘッダを送信する必要がありません。出力バッファリングを有効にし、それをオフにしない場合、PHP はスクリプトの実行終了後に自動的にバッファ内のすべてのデータをフラッシュします。ほとんどの場合、これをオンにしても害はなく、いくつかの構成ではわずかなパフォーマンスの向上が期待できます。

php.ini 設定ファイルを変更できるのであれば、次の項目を変更または追加することができます。

output_buffering = On

これは、ob_start()を呼び出す必要なく、出力バッファリングをアウトにします。

出力バッファリングについてより詳しく知るには、以下を参照してください。 http://php.net/manual/en/book.outcontrol.php