【发布时间】:2011-05-09 14:14:42
【问题描述】:
我的问题有点类似于下面的帖子..
PHP error: Cannot modify header information – headers already sent
但在我的情况下,一旦我确定登录表单中没有验证错误并且用户的登录信息与数据库的登录信息匹配,我选择启动会话。下面是代码:
登录页面(在任何 html 之前)
session_name('username');
session_name('ip');
session_name('start');
session_start();
Login.php sn-p(在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 = "<span id='error'>Login failed: Username or password not on file</span>";
}else {
$_SESSION['username'] = "$user";
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
header("Location: index.php");
}
}
}
}
如果您查看上面代码的 else 块,我正在验证登录,如果它很好,我想分配会话变量并转到我的索引页面。最开始有这段代码:
//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 顶部已经存在的一些代码逻辑?
安德烈
【问题讨论】: