web-dev-qa-db-ja.com

Warning:ヘッダ情報は変更できません - ヘッダは既にERRORによって送信されています

重複の可能性があります:ヘッダーはすでにPHPから送信されています

私は今しばらくこのエラーに苦しんでいます。

まず最初に、私はそれが空白であると思っただけでした、しかしさらなる研究の後に私はそれがこれと同じような問題であるかもしれないと思います:

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

Includeヘッダーがheader()と一緒に問題を引き起こしていると思いますが、このエラーを取り除くためにコードをどのように並べ替えるかはわかりません。

エラーを取り除く方法

<?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];
        }
    }
?>
84
Rob

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

あなたの問題に対する非常に素早い解決策は、追加することです。

ob_start();

この1つのスクリプトで必要な場合は、スクリプトの最初のものとして使用してください。すべてのスクリプトで必要な場合は、それをheader.phpファイルの最初のものとして追加してください。

これはPHPの出力バッファリング機能を有効にします。 PHPでは、何かを出力するとき(エコーや印刷をするとき)、そのときにHTTPヘッダを送信する必要があります。出力バッファリングをオンにすると、スクリプトで出力できますが、バッファがフラッシュされるまでPHPはヘッダを送信する必要はありません。オンにしてオフにしないと、PHPはスクリプトの実行が終了した後にバッファ内のすべてのものを自動的にフラッシュします。ほとんどすべての場合に電源を入れても害はなく、構成によってはパフォーマンスが少し向上することもあります。

Php.ini設定ファイルを変更する権限がある場合は、次のファイルを見つけて変更または追加できます。

output_buffering = On

これにより、ob_start()を呼び出さなくても出力のバッファリングが行われます。

出力バッファリングの詳細については、チェックアウトを参照してください http://php.net/manual/en/book.outcontrol.php

233
SamHennessy

インクルードファイルheader.phpechoprint()、またはprintr()で何かをチェックしてください。

これが問題である可能性があります。MVCファイルがある場合はOR、?>の後のスペース数を確認します。これも問題になる可能性があります。

10
Saiyam Patel

コンテンツを出力した後にヘッダ情報を送信しようとしています。

これを行いたい場合は、 出力バッファリングを探してください。

したがって、ob_start();を使うようにしてください

6
Pierre-Olivier

header()呼び出しにはいくつか問題がありますが、そのうちの1つが問題を引き起こしている可能性があります。

  • header("Location:を呼び出すたびに、exit()を付ける必要があります。そうしないと、コードの実行が続行されます。
  • :の後にスペースが必要です。"Location: http://foo"と読みます。
  • Locationヘッダーに相対URLを使用することは無効です。http://www.mysite.com/some/path.phpのような絶対URLを作成する必要があります。
5
James C