我对PHP很陌生,我想通过MySQL做一个用户登录系统。现在我正在处理登录程序。我有一个接受用户名的表单,操作是这个PHP脚本:
<?php
session_start();
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['password'];
?>
然后,主页面有:
<?php
if(isset($_SESSION['username']))
echo 'TESTESTEST';
else {
echo '<form action="/login.php" method = "post">';
echo 'Username: <input type="text" name="username" method="post"/>';
echo 'Password: <input type="password" name="password" method="post"/>';
echo '<input type="submit" value="Submit" method="post" />';
echo '</form>';
}
?>
基本上,如果会话是从之前设置的,它不会显示用户名/密码框,而是显示一条消息说TESTESTEST。然而,当我把这个页面显示给我的朋友时,他也有这个消息,没有登录框。如何为每个用户存储不同的会话?
session_start()
需要在每个页面的顶部调用。否则使用using $_SESSION
变量将导致未定义的行为。
会话是每个用户存储的,所以您可能会遇到另一个问题,例如没有在每个页面上调用session_start()
。让我来概述一下解决这个问题的一个更好的方法。
下面展示了很多好的编码实践。isset()调用可以防止发出E_STRICT警告。登录页面将自行发布,直到用户正确设置,然后重定向到下一页。任何其他页面都将检查已验证的会话,如果没有找到,则重定向回登录页面并显示错误消息。
如下所述,部分代码应该放在全局包含文件中,每个页面都包含该文件。
好运。
登录页面:/Login.php
<?php
session_start();
$username = trim(isset($_POST['username']) ? $_POST['username'] : '')
$password = trim(isset($_POST['password']) ? $_POST['password'] : '')
$error = trim(isset($_GET['error']) ? $_GET['error'] : '');
if(! empty($username) || ! empty($password))
{
// Authenticate if any username or password was submitted
// Ideally via query against MySQL
if($username == 'bob' && $password == 'bobpass')
{
$_SESSION['Authenticated'] = true;
$_SESSION['Expires'] = time() + 3600; // good for one hour
$_SESSION['username'] = $username;
// Now, redirect to login page
header('Location: /user/home.php');
exit();
}
else
{
// Oops, bad username/password...
$error = 'Invalid username and/or password';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<?php if($error) { ?>
<div style="color: red;">
<?php htmlspecialchars($error); ?>
</div>
<? } ?>
<form name="F" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES); ?>" >
Username: <input type="text" name="username" value="<?php echo htmlspecialchars($username, ENT_QUOTES); ?>" />
Password: <input type="password" name="password" />
<input type="submit" value="Login" />
</form>
</body>
</html>
任何其他页面,需要此代码来保护它…例如:/user/home.php
<?php
session_start();
// Following code checks for authenticated session, and either redirects back to
// login page, or allows user in. This should be put in a function and placed
// in a common include file.
if(isset($_SESSION['Authenticated']) && $_SESSION['Authenticated'])
{
//Ok, user was authenticated... Now, check expire time
if($_SESSION['Expires'] < time())
{
header('Location: /Login.php?error=Session+Expired');
exit;
}
// All still OK? Bump up the session expire time to one hour from now...
$_SESSION['Expires'] = time() + 3600; // good for one hour
}
... rest of page here ...
您必须在访问$_SESSION的每个页面上调用session_start()
。它将为访问该站点的用户恢复上一次会话。在调用session_destroy()