Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные с помощью ERROR

Возможный дубликат: Заголовки уже отправлены PHP

Я уже некоторое время борюсь с этой ошибкой.

Для начала я просто подумал, что это пробел, но после дальнейших исследований я думаю, что это может быть проблема, подобная этому:

Посмотрите на любые операторы, которые могли бы отправить вывод пользователю перед этим заголовком. Если вы найдете один или несколько, измените свой код, чтобы переместить заголовок перед ними. Сложные условные утверждения могут усложнить проблему, но они также могут помочь решить проблему. Рассмотрим условное выражение в верхней части PHP script, которое определяет значение заголовка как можно раньше и устанавливает его там.

Я предполагаю, что заголовок 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];
        }
    }
?>

Ответ 1

Долгосрочный ответ заключается в том, что весь вывод из ваших PHP-скриптов должен быть буферизирован в переменных. Это включает в себя заголовки и вывод тела. Затем в конце ваших скриптов вам нужен любой вывод.

Самое быстрое исправление для вашей проблемы - добавить

ob_start();

как самое первое в вашем script, если вам нужно только в этом script. Если вам это нужно во всех ваших сценариях, добавьте его как самое первое в своем файле header.php.

Это включает функцию буферизации вывода PHP. В PHP, когда вы что-то выводите (выполните эхо или печать), если в это время нужно отправить HTTP-заголовки. Если вы включите буферизацию вывода, вы можете вывести ее в script, но PHP не должен отправлять заголовки, пока буфер не будет сброшен. Если вы включите его и не отключите, PHP автоматически очистит все в буфере после завершения работы script. На самом деле нет никакого вреда, просто включив его почти во всех случаях и может дать вам небольшое увеличение производительности при некоторых конфигурациях.

Если у вас есть доступ к изменению конфигурационного файла php.ini, вы можете найти и изменить или добавить следующие

output_buffering = On

Это приведет к буферизации вывода без необходимости вызова ob_start().

Чтобы узнать больше о буферизации вывода, http://php.net/manual/en/book.outcontrol.php

Ответ 2

Проверить что-нибудь с echo, print() или printr() в включенном файле, header.php.

Возможно, это проблема ИЛИ, если какой-либо файл MVC, затем проверьте количество пробелов после ?>. Это также может стать проблемой.

Ответ 3

Есть проблемы с вашими вызовами header(), одна из которых может вызвать проблемы.

  • Вы должны поместить exit() после каждого из вызовов header("Location:, иначе выполнение кода будет продолжено
  • У вас должно быть пробел после :, поэтому он читает "Location: http://foo"
  • Неправильно использовать относительный URL в заголовке Location, вы должны составить абсолютный URL, например http://www.mysite.com/some/path.php

Ответ 4

Вы пытаетесь отправить информацию заголовков после вывода содержимого.

Если вы хотите сделать это, найдите выходную буферизацию.