帮助警告:无法修改标头信息 - 已经发送的标头(输出从C:\ ##错误开始)

时间:2009-09-04 18:50:46

标签: php http header

db_connect文件:

<?php
//connects to the database
    $username = "username";
    $password = "password";
    $hostname = "host";
    $database="database";
    $link=mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL".mysql_error());
    mysql_select_db($database, $link) or die("Could not select the database".mysql_error());
    ?>

进程登录文件:

<?php session_start();
include "DB_connect.php";
  if( !isset($_SESSION) )
  $username=$_POST["UserName"];
  $password=$_POST["Password"];
  $errormessage = "";

  $sql="SELECT * FROM members  where UserName='$username' and Password='$password'";
  $result = mysql_query($sql, $link)  or exit('$sql failed: '.mysql_error()); 
  $num_rows = mysql_num_rows($result);
  if($num_rows==0){header("Location:login.php");} 
  else {
    header("Location:MyPage.php");
    exit;
  }?>
你可以帮忙找出错误吗?

4 个答案:

答案 0 :(得分:6)

我建议从代码文件中删除PHP结束标记(?>)。解析器不需要它们,?>之后的任何空格字符都会导致输出到浏览器,并干扰setcookie()header()调用。在打开<?php标记之前,请确保文件顶部没有空格。我的猜测是你的db_connect文件末尾有空格。

顺便说一句,您有一个明显的SQL注入漏洞,因为您将$_POST变量直接放入查询中而不对其进行清理。你应该这样做:

$sql="SELECT * FROM members  where UserName='".
    mysql_real_escape_string($username)."' and
    Password='".mysql_real_escape_string($password)."'";

答案 1 :(得分:1)

在使用header()函数重新定义标题之前,不得向HTTP主体发送任何字符,这意味着不要开始响应的正文部分。

检查任何包含的文件在开头或结尾没有任何blanck的char行,并在调用header()之前检查没有echo。

在始终调用header()之前发送字符时总会发生此问题。

答案 2 :(得分:1)

在您发布的代码之前的某个地方,您发送了一个空行,或者更有可能发送了一些实际内容。一旦PHP开始发送页面内容,您就不能再更新标题(因为它们是在页面内容之前发送的)。

答案 3 :(得分:1)

在处理会话和登录等时,您应该使用输出缓冲来防止标头错误。像这样:

//Start the output buffer so we don't create any errors with headers
ob_start();

//Check to see if it has been started
if(session_started()){
    echo 'The session has been started.<br />';
}else{
    echo 'The session has not been started.<br />';
}

//Start the session
echo 'Starting Session...<br />';
session_start();