Skip to content

第 10 章:会话控制(登录状态) ​

Cookie 是存储在用户浏览器中的小型文本文件,用于存储用户信息和状态。

  1. 服务器通过 HTTP 响应头 Set-Cookie 向浏览器发送 Cookie
  2. 浏览器将 Cookie 存储在本地
  3. 当用户再次访问服务器时,浏览器通过 HTTP 请求头 Cookie 将 Cookie 发送回服务器
  4. 服务器根据 Cookie 中的信息识别用户
php
<?php
// 设置 Cookie
setcookie('username', '张三', time() + 3600, '/');

// 设置带过期时间的 Cookie
$expire = time() + 3600; // 1 小时后过期
setcookie('user_id', '123', $expire, '/', '', false, true); // 最后一个参数为 true 表示只在 HTTPS 下传输
?>
php
<?php
// 读取 Cookie
$username = $_COOKIE['username'] ?? '';
echo "用户名:$username";

// 检查 Cookie 是否存在
if (isset($_COOKIE['user_id'])) {
    echo "用户 ID:" . $_COOKIE['user_id'];
}
?>
php
<?php
// 删除 Cookie(设置过期时间为过去的时间)
setcookie('username', '', time() - 3600, '/');
?>

10.2 Session 原理与使用 ​

Session 基本概念 ​

Session 是存储在服务器端的用户会话数据,用于跟踪用户状态。

Session 的工作原理 ​

  1. 服务器为每个用户创建一个唯一的 Session ID
  2. 服务器将 Session ID 通过 Cookie 发送给浏览器
  3. 浏览器在后续请求中携带 Session ID
  4. 服务器根据 Session ID 找到对应的会话数据

启动 Session ​

php
<?php
// 启动 Session
session_start();

// 存储 Session 数据
$_SESSION['username'] = '张三';
$_SESSION['user_id'] = 123;
?>

读取 Session 数据 ​

php
<?php
// 启动 Session
session_start();

// 读取 Session 数据
$username = $_SESSION['username'] ?? '';
$user_id = $_SESSION['user_id'] ?? '';

echo "用户名:$username";
echo "用户 ID:$user_id";
?>

删除 Session 数据 ​

php
<?php
// 启动 Session
session_start();

// 删除单个 Session 变量
unset($_SESSION['username']);

// 清空所有 Session 数据
$_SESSION = [];

// 销毁 Session
session_destroy();
?>

10.3 登录与退出逻辑 ​

登录逻辑 ​

php
<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 接收数据
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    
    // 验证用户(实际应用中会查询数据库)
    if ($username === 'admin' && $password === '123456') {
        // 登录成功,存储用户信息到 Session
        $_SESSION['username'] = $username;
        $_SESSION['user_id'] = 1;
        $_SESSION['is_logged_in'] = true;
        
        // 跳转到首页
        header('Location: index.php');
        exit;
    } else {
        $error = "用户名或密码错误";
    }
}
?>

退出逻辑 ​

php
<?php
session_start();

// 清空 Session 数据
$_SESSION = [];

// 销毁 Session
session_destroy();

// 跳转到登录页
header('Location: login.php');
exit;
?>

10.4 登录状态判断 ​

检查登录状态 ​

php
<?php
session_start();

// 检查是否登录
if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
    // 未登录,跳转到登录页
    header('Location: login.php');
    exit;
}

// 已登录,显示用户信息
echo "欢迎," . $_SESSION['username'] . "!";
echo "<a href='logout.php'>退出登录</a>";
?>

示例:受保护的页面 ​

php
<?php
// protect.php
 session_start();

// 检查登录状态
if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
    header('Location: login.php');
    exit;
}

// 页面内容
echo "<h1>受保护的页面</h1>";
echo "欢迎," . $_SESSION['username'] . "!";
echo "<p>这是只有登录用户才能访问的页面</p>";
echo "<a href='logout.php'>退出登录</a>";
?>

10.5 实操:用户登录系统 ​

创建 login.php 文件 ​

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .form-container {
            width: 300px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        input {
            width: 100%;
            padding: 10px;
            margin: 5px 0;
            box-sizing: border-box;
        }
        button {
            width: 100%;
            padding: 10px;
            margin: 10px 0;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 3px;
            cursor: pointer;
        }
        button:hover {
            background-color: #45a049;
        }
        .error {
            color: red;
            font-size: 12px;
        }
    </style>
</head>
<body>
    <h1>用户登录</h1>
    <div class="form-container">
        <?php
        session_start();
        
        // 检查是否已登录
        if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
            header('Location: index.php');
            exit;
        }
        
        $error = '';
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // 接收数据
            $username = $_POST['username'] ?? '';
            $password = $_POST['password'] ?? '';
            
            // 验证用户(实际应用中会查询数据库)
            if ($username === 'admin' && $password === '123456') {
                // 登录成功,存储用户信息到 Session
                $_SESSION['username'] = $username;
                $_SESSION['user_id'] = 1;
                $_SESSION['is_logged_in'] = true;
                
                // 跳转到首页
                header('Location: index.php');
                exit;
            } else {
                $error = "用户名或密码错误";
            }
        }
        
        // 显示错误
        if (!empty($error)) {
            echo '<p class="error">' . $error . '</p>';
        }
        ?>
        
        <form method="post">
            <input type="text" name="username" placeholder="用户名" value="<?php echo htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"><br>
            <input type="password" name="password" placeholder="密码"><br>
            <button type="submit">登录</button>
        </form>
    </div>
</body>
</html>

创建 index.php 文件 ​

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .welcome {
            float: right;
        }
    </style>
</head>
<body>
    <?php
    session_start();
    
    // 检查登录状态
    if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
        echo '<div class="welcome">';
        echo '欢迎,' . $_SESSION['username'] . '!';
        echo ' <a href="logout.php">退出登录</a>';
        echo '</div>';
    } else {
        echo '<div class="welcome">';
        echo '<a href="login.php">登录</a>';
        echo '</div>';
    }
    ?>
    
    <h1>首页</h1>
    <p>这是网站首页</p>
    
    <?php
    if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
        echo '<p><a href="dashboard.php">进入控制面板</a></p>';
    } else {
        echo '<p>请登录后访问控制面板</p>';
    }
    ?>
</body>
</html>

创建 dashboard.php 文件 ​

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>控制面板</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .welcome {
            float: right;
        }
    </style>
</head>
<body>
    <?php
    session_start();
    
    // 检查登录状态
    if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
        header('Location: login.php');
        exit;
    }
    
    echo '<div class="welcome">';
    echo '欢迎,' . $_SESSION['username'] . '!';
    echo ' <a href="logout.php">退出登录</a>';
    echo '</div>';
    ?>
    
    <h1>控制面板</h1>
    <p>这是用户控制面板,只有登录用户才能访问</p>
    <p>用户 ID:<?php echo $_SESSION['user_id']; ?></p>
    <p>用户名:<?php echo $_SESSION['username']; ?></p>
    <p><a href="index.php">返回首页</a></p>
</body>
</html>

创建 logout.php 文件 ​

php
<?php
session_start();

// 清空 Session 数据
$_SESSION = [];

// 销毁 Session
session_destroy();

// 跳转到登录页
header('Location: login.php');
exit;
?>

访问页面 ​

  1. 将文件保存到网站根目录
  2. 打开浏览器,访问 http://localhost/login.php
  3. 使用用户名 admin 和密码 123456 登录
  4. 测试登录、退出和访问受保护页面的功能

小结 ​

通过本章的学习,你掌握了 PHP 的会话控制技术,包括 Cookie 和 Session 的原理与使用。你还学习了如何实现用户登录、退出逻辑以及登录状态判断。会话控制是 Web 应用中非常重要的功能,它允许服务器跟踪用户的登录状态和会话数据,为用户提供个性化的体验。在后续的学习中,你将经常使用这些技术来实现用户认证和授权功能。

© 2026 编程马·菜鸟教程 版权所有