Предупреждение: не удается изменить информацию заголовка - заголовки уже отправлены ошибки [дубликат]


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

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

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

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

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

4 ответа:

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

очень быстрое решение вашей проблемы будет добавить

ob_start();

как самое первое в вашем скрипте, если вам это нужно только в этом скрипте. Если вам это нужно во всех ваших скриптах, добавьте его как самое первое в вашем заголовке.PHP-файл.

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

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

output_buffering = On

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

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

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

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

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

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

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

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