我有个奇怪的问题。我已经用PHP创建了一个可以正常工作的登录页面。我决定在用户点击登录页面时销毁所有会话。但是,通过这样做,用户永远不会登录。我看不出有什么问题。
登录页面
<?php
session_start();
// Destroy any active session
session_destroy();
// Regenerate Session ID
session_regenerate_id(true);
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$password = md5($_POST['password']);
if(strlen($username) > 12) {
header('Location: index.php');
}
try {
$dbh = new PDO('mysql:dbname=addcovers;host=127.0.0.1', 'root', '');
$sth = $dbh->prepare('SELECT display_name FROM users WHERE username = :username && password = :password');
$sth->bindParam(':username', $username, PDO::PARAM_STR, 12);
$sth->bindParam(':password', $password, PDO::PARAM_STR, 32);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_OBJ);
if($result) {
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $result->display_name;
header('Location: index.php');
}
} catch (PDOException $e) {
// DEBUG: echo 'Connection failed: ' . $e->getMessage();
}
}
?>
<!DOCTYLE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="css/reset.css" type="text/css" media="all">
<link rel="stylesheet" href="css/base.css" type="text/css" media="all">
</head>
<body id="admin-login">
<form action="login.php" method="POST">
<fieldset>
<div><label for="username">Username</label><input type="text" name="username" maxlength="12"></div>
<div><label for="password">Password</label><input type="password" name="password"></div>
<button type="submit">Admin Login</button>
</fieldset>
</form>
</body>
管理页面
<?php
session_start();
if(!isset($_SESSION['logged_in'])) header('Location: login.php');
echo 'Welcome ' . $_SESSION['user'];
?>如果我从登录页面中删除session_destroy,它可以正常工作。目前,即使凭据是正确的,用户也会继续访问登录页面。
发布于 2011-12-20 08:16:32
在用户登录之前调用session_destroy没有任何好处--即使您真的想这样做,这也不是正确的方法。
session_destroy的文档说,在调用它之后,
若要再次使用会话变量,必须调用
session_start()。
您不需要这样做,所以您稍后设置的会话变量不会“卡住”,管理页面会重定向回login。
如果您确实希望完全销毁用户会话,则:
https://stackoverflow.com/questions/8569257
复制相似问题