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;
}?>
你可以帮忙找出错误吗?
答案 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();