Возможный дубликат: заголовки, уже отправленные PHP
Некоторое время я боролся с этой ошибкой.
Для начала я просто подумал, что это пустое пространство, но после дальнейших исследований я думаю, что это может быть проблемой, подобной этому:
Посмотрите на любые операторы, которые могли бы отправить результат пользователю перед этим заголовком. Если вы найдете один или несколько, измените свой код, чтобы переместить заголовок перед ними. Сложные условные утверждения могут усложнить проблему, но они также могут помочь решить проблему. Рассмотрим условное выражение в верхней части скрипта 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]; } } ?>
Долгосрочный ответ заключается в том, что все выходные данные ваших PHP-скриптов должны буферизироваться в переменных. Это включает в себя заголовки и вывод тела. Затем в конце ваших скриптов вам нужен любой вывод.
Очень быстрое решение проблемы заключается в том, чтобы добавить
ob_start();
как самое первое в вашем скрипте, если вам нужно только в этом сценарии. Если вам это нужно во всех ваших сценариях, добавьте его как самое первое в своем файле header.php.
Это включает функцию буферизации вывода PHP. В PHP, когда вы что-то выводите (выполните эхо или печать), если в это время нужно отправить HTTP-заголовки. Если вы включите буферизацию вывода, вы можете вывести ее в скрипт, но PHP не должен отправлять заголовки до тех пор, пока буфер не будет сброшен. Если вы включите его и не отключите, PHP автоматически очистит все в буфере после завершения работы скрипта. На самом деле нет никакого вреда, просто включив его почти во всех случаях и может дать вам небольшое увеличение производительности при некоторых конфигурациях.
Если у вас есть доступ к изменению файла конфигурации php.ini, вы можете найти и изменить или добавить следующие
output_buffering = On
Это приведет к буферизации вывода без необходимости вызова ob_start ().
Чтобы узнать больше о выходной буферизации, проверьте http://php.net/manual/en/book.outcontrol.php
Проверьте что-то с echo
, print()
или printr()
в include-файле, header.php
.
Возможно, это проблема ИЛИ, если какой-либо файл MVC, а затем проверить количество пробелов после ?>
. Это также может стать проблемой.
Есть некоторые проблемы с вашими вызовами header()
, одна из которых может вызвать проблемы
exit()
после каждого из header("Location:
вызывает иначе выполнение кода будет продолжаться :
поэтому он читает "Location: http://foo"
Location
, вы должны составить абсолютный URL-адрес, например http://www.mysite.com/some/path.php
Вы пытаетесь отправить информацию заголовков после вывода содержимого.
Если вы хотите это сделать, найдите буферизацию вывода.