php - funciona - Advertencia: No se puede modificar la información del encabezado: los encabezados ya enviados por ERROR
php header location); (4)
Posible duplicado: encabezados ya enviados por PHP
He estado luchando con este error desde hace un tiempo.
Para empezar, pensé que era un espacio en blanco, pero después de más investigaciones, creo que podría ser un problema similar al siguiente:
Busque cualquier declaración que pueda enviar la salida al usuario antes de esta declaración de encabezado. Si encuentra uno o más, cambie su código para mover la declaración del encabezado antes que ellos. Las declaraciones condicionales complejas pueden complicar el problema, pero también pueden ayudar a resolver el problema. Considere una expresión condicional en la parte superior de la secuencia de comandos de PHP que determina el valor del encabezado tan pronto como sea posible y lo establece allí.
Supongo que el encabezado de inclusión está causando el problema junto con el encabezado (), pero no estoy seguro de cómo reorganizar el código para deshacerse de 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];
}
}
?>
Compruebe algo con echo
, print()
o printr()
en el archivo de inclusión, header.php
.
Es posible que este sea el problema O, si hay algún archivo MVC, luego verifique el número de espacios después de ?>
. Esto también podría ser un problema.
Está tratando de enviar información de encabezados después de la salida del contenido.
Si desea hacer esto, busque el buffer de salida.
Hay algunos problemas con las llamadas a su header()
, una de las cuales podría estar causando problemas
- Debería colocar una
exit()
después de cadaheader("Location:
llamadasheader("Location:
lo contrario, la ejecución del código continuará) - Deberías tener un espacio después del
:
por lo que dice"Location: http://foo"
- No es válido utilizar una URL relativa en un encabezado de
Location
, debe formar una URL absoluta comohttp://www.mysite.com/some/path.php
La respuesta a largo plazo es que todos los resultados de tus scripts PHP deben almacenarse en variables. Esto incluye encabezados y salida del cuerpo. Luego, al final de tus scripts, haz cualquier salida que necesites.
La solución más rápida para su problema será agregar
ob_start();
como lo primero en tu script si solo lo necesitas en este script. Si lo necesita en todos sus scripts, agréguelo como lo primero en su archivo header.php.
Esto activa la función de almacenamiento en búfer de salida de PHP. En PHP cuando saca algo (haz un eco o imprime) si tiene que enviar los encabezados HTTP en ese momento. Si activa el almacenamiento en búfer de salida, puede generar el resultado en el script, pero PHP no tiene que enviar los encabezados hasta que se vacíe el búfer. Si lo enciende y no lo apaga, PHP vaciará automáticamente todo en el búfer después de que el script termine de ejecutarse. Realmente no hay nada malo en encenderlo en casi todos los casos y podría darte un pequeño aumento de rendimiento en algunas configuraciones.
Si tiene acceso para cambiar su archivo de configuración php.ini, puede encontrar y cambiar o agregar lo siguiente
output_buffering = On
Esto desactivará el buffer de salida sin la 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