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 编程马·菜鸟教程 版权所有