本问题已经有最佳答案,请猛点这里访问。
我的问题有点类似于以下帖子。
PHP错误:无法修改标头信息–标头已发送
但就我而言,一旦确定登录表单中没有验证错误并且用户的登录信息与数据库的登录信息匹配,我便选择开始会话。这是下面的代码:
登录页面(任何html之前)
Login.php代码段(在html正文中)
} else {
$user = $_POST['username'];
$userpass = md5($_POST['password']);
$login_results = statement("select username, password from `$admin` where username='$user' and password='$userpass'");
if (mysql_num_rows($login_results)!= 1) {
$errmsg ="Login failed: Username or password not on file";
}else {
$_SESSION['username'] ="$user";
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
header("Location: index.php");
}
}
}
}
如果您看上面代码的else块,我正在验证登录名,如果它很好,我想分配session变量并转到我的索引页。在一开始就具有以下代码:
//Session Timeout Script -- used to determine the amount of time the user has been idle. If it the user has been idle for longer then the session time, log the user out.
//Secondary to the Timeout Script, the username and ip address is checked for validility and if either fails redirect the user to the login page.
session_cache_expire( 20 );
session_start();
$inactive = 1200;
if(isset($_SESSION['start']) ) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive){
header("Location: logout.php");
}
}
$_SESSION['start'] = time();
$newip = $_SERVER['REMOTE_ADDR'];
if (!isset($_SESSION['username']) || empty($_SESSION['username']) || $newip!= $_SESSION['ip']) {
header('Location: login.php');
}
现在通读前一位作者的问题,有人提到header()应该是在发送重定向的代码中执行的第一件事,在我的情况下,该代码是login.php。这样做允许我登录,但是注销后,我将破坏所有会话,并使用header()将我发送回登录页面。这将使登录页面重定向回索引页面,因为它已读取第一行代码。有办法避免这种情况吗?所以我不需要重复在login.php顶部已经存在的一些代码逻辑?
安德烈
是的,header必须在任何其他输出之前调用,http本身需要它,而没有办法解决。 但是,您可以在session_start()之后调用标头。
因此,您可以启动会话,从$_POST检查登录数据,然后启动html输出。
顺便说一句,为什么要连续使用三个session_name?
好吧,我现在将我的if else块(后文中显示的其他块)移到了任何html输出之前,并删除了session_names,以
忽略这个帖子,罪魁祸首是多余的空间
我在标头函数中遇到了类似的问题。
首先,请确保.php文件的开头和结尾没有空格。
这样的事情有时会导致此类错误:
//Codes...
如您所见,PHP标记开始前有一个空格。 当您的PHP代码与HTML混合使用时,会导致荒谬的错误。
据我所记得,在打开PHP标记后,对session_start()函数的调用必须是文件开头的第一行代码。
我很确定那会在不久前引起我一些问题。
哦,还有另一件事。 据我记得,您无法多次调用header()函数。 级联是不可能的。
确定再次读取错误,它声称输出已经发送到我的header()执行之前的包含文件中。 现在,我进入该文件并删除了空格,现在感谢其工作,感谢M2X。
当然! ;-]不要忘记为其他人遇到的问题标记为已回答。
您可能还需要使用输出缓冲。 请参阅有关OB任务的PHP手册。