【PHP入门】记忆状态的魔法!如何用Session创建登录认证
浏览网站时,“登录”功能就像是理所当然的存在,对吧?一旦登录,即使跳转到其他页面,“登录状态”也会被保持,可以查看会员专属内容。但是,Web通信(HTTP)本身具有“不记忆状态”的特性,每个页面的请求都是独立的。那么,网站是如何保持登录状态的呢?
その秘密が、PHPのセッション (Session) という技術です。セッションは、訪問者一人ひとりに「あなたはログイン済みですよ」という合言葉をサーバー側に記憶させておく仕組みです。この記事では、このセッション機能を使って、簡単なパスワード認証付きの「会員限定ページ」を作成する方法を解説します。2つのファイルを作るだけで、Webサイトに必須のログイン機能の核心部分を体験できます。コピペで動かして、状態を記憶する魔法を実感してみましょう!
要准备运行PHP(开发环境),如果还没有搭建XAMPP的朋友,请参考【PHP入门】XAMPP下载及安装方法完全解析!。 安装后,将PHP文件放置在指定文件夹(如 `htdocs`)中,准备工作就完成了!
1. Session的机制:PHP的记忆术
Session是一种在服务器端临时保存网站访问者信息的机制。打个比方,就像在活动会场的入口处戴上腕带一样。一旦戴上腕带(Session开始),无论你走到会场的哪个区域(页面),工作人员(服务器)都能识别出你是合法的参与者(已登录用户)。
在PHP中处理Session,主要记住3个命令就可以了。
session_start(): 这是“现在开始使用Session!”的开始信号。所有使用Session的页面的最开始都必须写上这句。$_SESSION: 这是一个特殊的数组,用于保存登录状态等信息。可以像$_SESSION['键'] = 值;这样自由地保存和确认数据。session_destroy(): 在退出登录等时候,完全删除保存在服务器上的Session信息。
我们将使用这三个命令来构建登录系统。
2. 实践!来构建一个登录系统吧
这次,我们将创建以下两个文件。
- login.php: 显示登录表单并进行密码认证的文件。
- member_page.php: 只有登录用户才能看到的会员专属页面。
请将这两个文件保存在同一个文件夹中。
文件1: login.php(登录页面)
这个文件包含了密码输入表单和检查所提交密码是否正确的逻辑。
<?php
// ① 启动会话
session_start();
$error_message = '';
// ② 如果有POST请求(表单提交)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ③ 与硬编码的密码进行比对
$correct_password = 'password123'; // 本来应该在数据库中管理
$input_password = $_POST['password'];
if ($input_password === $correct_password) {
// ④ 如果密码匹配
$_SESSION['is_logged_in'] = true; // 在Session中保存登录状态
header('Location: member_page.php'); // 重定向到会员页面
exit;
} else {
// 如果密码不匹配
$error_message = '密码错误。';
}
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>登录</title>
<style>
body { font-family: sans-serif; padding: 20px; text-align: center; }
.login-form { max-width: 300px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 8px; }
input[type="password"] { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
.error { color: red; margin-bottom: 10px; }
</style>
</head>
<body>
<div class="login-form">
<h1>登录</h1>
<?php if ($error_message): ?>
<p class="error"><?php echo $error_message; ?></p>
<?php endif; ?>
<form action="login.php" method="POST">
<input type="password" name="password" placeholder="密码" required>
<button type="submit">登录</button>
</form>
</div>
</body>
</html>
文件2: member_page.php(会员专属页面)
这个页面在被访问时,会检查是否存在“已登录”的证据(Session信息)。如果没有证据,就会不由分说地将用户赶回登录页面。
<?php
// ① 启动会话
session_start();
// ② 检查登录状态
// 如果 $_SESSION['is_logged_in'] 不存在或不为true,则重定向到登录页面
if (!isset($_SESSION['is_logged_in']) || $_SESSION['is_logged_in'] !== true) {
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>会员专属页面</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.content { border: 2px dashed #007bff; padding: 20px; background: #f0f8ff; }
a { color: #d9534f; }
</style>
</head>
<body>
<h1>欢迎您,会员!</h1>
<div class="content">
<p>这里是只有登录用户才能看到的特别内容。</p>
<p>(在此显示会员专属信息)</p>
</div>
<p><a href="logout.php">退出登录</a></p>
</body>
</html>
这样就准备好了!请在浏览器中访问`login.php`,并尝试输入密码“`password123`”。如果正确,页面将跳转到会员页面;如果错误,将显示错误消息。此外,您还可以确认,如果未经登录直接访问`member_page.php`,将会被强制返回到`login.php`。
3. 注意事项与应用示例
这个简单的机制非常强大,但在实际应用中,还需要进一步提高安全性。
密码的安全保管
在本次的例子中,我们将密码以`'password123'`的形式直接写在代码里(硬编码)。这是非常危险的。在实际开发中,密码必须经过**哈希化**处理,以无法还原出原始密码的形式保存在数据库中。
PHP为此准备了`password_hash()`和`password_verify()`函数。
<?php
// 将密码哈希化后保存(如用户注册时)
$hashed_password = password_hash('password123', PASSWORD_DEFAULT);
// 验证登录时输入的密码是否与保存的哈希值匹配
if (password_verify('password123', $hashed_password)) {
echo '密码匹配!';
} else {
echo '密码错误。';
}
?>
退出登录处理
我们在会员页面上设置了“退出登录”链接。该链接的目的地文件`logout.php`中,需要有安全销毁Session的处理。
<?php
session_start();
// 解除所有Session变量
$_SESSION = array();
// 销毁Session
session_destroy();
// 退出登录后重定向到登录页面
header('Location: login.php');
exit;
?>
通过`session_destroy()`完全销毁Session,即可完成退出登录。
4. 总结
这次,我们学习了如何使用PHP的Session功能,让网站“记忆”状态,并构建一个简单的登录系统。您是否掌握了通过`session_start()`开始Session,在`$_SESSION`数组中存储信息,以及即使页面跳转信息也能保持的这个流程呢?
Session的这个机制,不仅用于登录认证,还应用于多页面表单、记忆购物车内容等多种场景,是构成Web应用程序核心的技术。请务必掌握这个基础,并挑战开发更高级的功能!