Uwaga: nie można modyfikować informacji o nagłówku-nagłówki już wysłane przez błąd [duplikat]

Możliwy Duplikat: nagłówki już wysłane przez PHP

Od jakiegoś czasu zmagam się z tym błędem.

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];
        }
    }
?>
 81
Author: Community, 2012-03-14

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

 227
Author: SamHennessy,
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.

 10
Author: Saiyam Patel,
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łaniu header("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 jak http://www.mysite.com/some/path.php
 5
Author: James C,
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 .

 5
Author: Pierre-Olivier,
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