我一直在努力解决这个错误。
首先,我只是认为它是白色空间,但经过进一步研究后,我认为这可能是一个类似的问题:
查找在此header语句之前可以向用户发送输出的任何语句。如果找到一个或多个,请更改代码以在其前面移动header语句。复杂的条件语句可能会使问题复杂化,但它们也可能有助于解决问题。考虑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];
}
}
?>
答案 0 :(得分:233)
长期的答案是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
答案 1 :(得分:10)
使用包含文件echo
中的print()
,printr()
或header.php
检查一些内容。
这可能是问题或者如果有任何MVC文件,那么检查?>
之后的空格数。这也可能会产生问题。
答案 2 :(得分:6)
答案 3 :(得分:5)
您的header()
电话存在一些问题,其中一个可能会导致问题
exit()
次调用之后添加header("Location:
,否则代码执行将继续:
之后应该有一个空格,因此它会显示"Location: http://foo"
Location
标题中使用相对网址无效,您应该形成一个绝对网址,例如http://www.mysite.com/some/path.php