Uwaga: nie można modyfikować informacji o nagłówku-nagłówki już wysłane przez błąd [duplikat]
Od jakiegoś czasu zmagam się z tym błędem.Możliwy Duplikat: nagłówki już wysłane przez PHP
Na początek myślałem, że to biała przestrzeń, ale po dalszych badaniach myślę, że może to być problem podobny do tego:
Poszukaj instrukcji, które mogłyby wysłać wyjście do użytkownika przed tą instrukcją nagłówka. Jeśli znajdziesz jedną lub więcej, Zmień kod, aby przenieść instrukcję nagłówka przed nimi. Kompleks instrukcje warunkowe mogą skomplikować problem, ale mogą również pomóc rozwiązać problem. Rozważ wyrażenie warunkowe na górze skryptu PHP, które określa wartość nagłówka tak wcześnie, jak to możliwe i ustawia ją tam.
Domyślam się, że nagłówek include powoduje problem wraz z header (), ale nie jestem pewien, jak zmienić układ kodu, aby pozbyć się tego błędu.
Jak usunąć błąd?
<?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 answers
Długoterminowa odpowiedź jest taka, że wszystkie dane wyjściowe ze skryptów PHP powinny być buforowane w zmiennych. Obejmuje to nagłówki i body output. Następnie na końcu skryptów wykonaj dowolne wyjście, którego potrzebujesz.
Bardzo szybkim rozwiązaniem problemu będzie dodanie
ob_start();
Jako pierwsza rzecz w Twoim skrypcie, jeśli potrzebujesz go tylko w tym jednym skrypcie. Jeśli potrzebujesz go we wszystkich skryptach, dodaj go jako pierwszą rzecz w nagłówku.plik php.
Włącza buforowanie wyjściowe PHP cecha. W PHP, gdy wypisujesz coś (wykonaj echo lub wydrukuj), jeśli musisz wysłać nagłówki HTTP w tym czasie. Jeśli włączysz buforowanie wyjściowe, możesz wyjść w skrypcie, ale PHP nie musi wysyłać nagłówków, dopóki bufor nie zostanie spłukany. Jeśli go włączysz i nie wyłączysz, PHP automatycznie spuści wszystko w buforze po zakończeniu działania skryptu. Naprawdę nie ma nic złego w włączeniu go w prawie wszystkich przypadkach i może dać niewielki wzrost wydajności pod pewnymi konfiguracje.
Jeśli masz dostęp do zmiany php.plik konfiguracyjny ini można znaleźć i zmienić lub dodać następujące
output_buffering = On
Spowoduje to wyłączenie buforowania wyjścia bez konieczności wywoływania ob_start ().
Aby dowiedzieć się więcej o buforowaniu wyjścia sprawdź http://php.net/manual/en/book.outcontrol.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 19:50:42
Sprawdź coś z echo
, print()
lub {[2] } w pliku dołączonym, header.php
.
Może być tak, że to jest problem lub jeśli jakiś plik MVC, to sprawdź liczbę spacji po ?>
. Może to również stanowić problem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-13 10:32:45
Są pewne problemy z telefonami header()
, z których jeden może powodować problemy
- należy umieścić
exit()
po każdym wywołaniuheader("Location:
w przeciwnym razie wykonywanie kodu będzie kontynuowane - powinieneś mieć spację po
:
, więc to czyta"Location: http://foo"
- nie jest poprawne używanie względnego adresu URL w nagłówku
Location
, powinieneś utworzyć absolutny adres URL, taki jakhttp://www.mysite.com/some/path.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 18:20:23
Próbujesz wysłać informacje o nagłówkach po wyświetleniu zawartości.
Jeśli chcesz to zrobić, poszukaj buforowania wyjścia .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 18:21:03