我是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的消息。但是,当我向朋友展示此页面时,他也有此消息而没有登录框。如何制作,以便为每个用户存储不同的会话?
答案 0 :(得分:4)
session_start()
。否则,使用$_SESSION
变量将导致未定义的行为。正如你所注意到的那样。
答案 1 :(得分:2)
会话按用户存储,因此您可能会遇到其他问题,例如不在每个页面上调用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 ...
答案 2 :(得分:0)
您必须在访问$ _SESSION的每个页面上调用session_start()
。它将恢复访问该站点的用户的最后一个会话。在致电session_destroy()