🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【PHP入门】记忆状态的魔法!如何用Session创建登录认证

浏览网站时,“登录”功能就像是理所当然的存在,对吧?一旦登录,即使跳转到其他页面,“登录状态”也会被保持,可以查看会员专属内容。但是,Web通信(HTTP)本身具有“不记忆状态”的特性,每个页面的请求都是独立的。那么,网站是如何保持登录状态的呢?

その秘密が、PHPのセッション (Session) という技術です。セッションは、訪問者一人ひとりに「あなたはログイン済みですよ」という合言葉をサーバー側に記憶させておく仕組みです。この記事では、このセッション機能を使って、簡単なパスワード認証付きの「会員限定ページ」を作成する方法を解説します。2つのファイルを作るだけで、Webサイトに必須のログイン機能の核心部分を体験できます。コピペで動かして、状態を記憶する魔法を実感してみましょう!

要准备运行PHP(开发环境),如果还没有搭建XAMPP的朋友,请参考【PHP入门】XAMPP下载及安装方法完全解析!。 安装后,将PHP文件放置在指定文件夹(如 `htdocs`)中,准备工作就完成了!

1. Session的机制:PHP的记忆术

Session是一种在服务器端临时保存网站访问者信息的机制。打个比方,就像在活动会场的入口处戴上腕带一样。一旦戴上腕带(Session开始),无论你走到会场的哪个区域(页面),工作人员(服务器)都能识别出你是合法的参与者(已登录用户)。

在PHP中处理Session,主要记住3个命令就可以了。

  1. session_start(): 这是“现在开始使用Session!”的开始信号。所有使用Session的页面的最开始都必须写上这句。
  2. $_SESSION: 这是一个特殊的数组,用于保存登录状态等信息。可以像$_SESSION['键'] = 值;这样自由地保存和确认数据。
  3. session_destroy(): 在退出登录等时候,完全删除保存在服务器上的Session信息。

我们将使用这三个命令来构建登录系统。

2. 实践!来构建一个登录系统吧

这次,我们将创建以下两个文件。

请将这两个文件保存在同一个文件夹中。

文件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应用程序核心的技术。请务必掌握这个基础,并挑战开发更高级的功能!