Advertencia: No se puede modificar la información del encabezado-los encabezados ya enviados por ERROR [duplicar]


Posible duplicado: Encabezados ya enviados por PHP

He estado luchando con este error durante un tiempo.

Para empezar, pensé que era espacio en blanco, pero después de más investigación creo que podría ser un problema similar a este:

Busque cualquier instrucción que pueda enviar resultados al usuario antes de esta instrucción de encabezado. Si encuentra uno o más, cambie su código para mover la instrucción header antes que ellos. Complejo las declaraciones condicionales pueden complicar el problema, pero también pueden ayudar a resolver el problema. Considere una expresión condicional en la parte superior del script PHP que determina el valor del encabezado lo antes posible y lo establece allí.

Supongo que el encabezado include está causando el problema junto con el encabezado(), pero no estoy seguro de cómo reorganizar el código para eliminar este error.

¿Cómo elimino el error?

<?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

La respuesta a largo plazo es que todos los resultados de sus scripts PHP deben almacenarse en búfer en variables. Esto incluye encabezados y salida de cuerpo. Luego, al final de sus scripts, haga cualquier salida que necesite.

La solución muy rápida para su problema será agregar

ob_start();

Como la primera cosa en su script si solo lo necesita en este script. Si lo necesita en todos sus scripts, agréguelo como la primera cosa en su encabezado.archivo php.

Esto activa el búfer de salida de PHP función. En PHP cuando se produce algo (hacer un eco o imprimir) si tiene que enviar las cabeceras HTTP en ese momento. Si activa el almacenamiento en búfer de salida, puede generar la salida en el script, pero PHP no tiene que enviar los encabezados hasta que el búfer se vacíe. Si lo enciendes y no lo apagas, PHP borrará automáticamente todo el búfer después de que el script termine de ejecutarse. Realmente no hay ningún daño en solo encenderlo en casi todos los casos y podría darle un pequeño aumento de rendimiento bajo algunos configuraciones.

Si tiene acceso para cambiar su php.archivo de configuración ini puede encontrar y cambiar o agregar lo siguiente

output_buffering = On

Esto desactivará el búfer de salida sin necesidad de llamar a ob_start().

Para obtener más información sobre el almacenamiento en búfer de salida, consulte 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-14 19:50:42

Compruebe algo con echo, print() o printr() en el archivo include, header.php.

Podría ser que este es el problema O si cualquier archivo MVC, a continuación, comprobar el número de espacios después de ?>. Esto también podría crear un problema.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-13 10:32:45

Hay algunos problemas con sus llamadas header(), uno de los cuales podría estar causando problemas

  • Debe poner un exit() después de cada una de las llamadas header("Location: de lo contrario la ejecución de código continuará
  • Usted debe tener un espacio después de la : por lo que se lee "Location: http://foo"
  • No es válido usar una URL relativa en un encabezado Location, debe formar una URL absoluta como 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-14 18:20:23

Está intentando enviar información de encabezados después de publicar contenido.

Si desea hacer esto, busque almacenamiento en búfer de salida.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-14 18:21:03