首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 實作使用者登入狀態管理:從基礎操作到完整登入/登出範例

     編輯:PHP 相關知識

Session 基礎操作三部曲

1. 建立 Session

<?php
session_start();           // 必須在輸出前呼叫
$username = "nostop";
$_SESSION['username'] = $username;  // 現代寫法(建議)
// 舊式:session_register("username"); // PHP 5.4+ 已移除
?>

2. 讀取 Session

<?php
session_start();
echo "登入用戶:" . $_SESSION['username']; // 輸出:登入用戶:nostop
?>

3. 銷毀 Session

函數/方法作用
unset($_SESSION['key'])刪除單一 session 變數
session_unset()刪除所有 session 變數(保留 session 本身)
session_destroy()徹底銷毀 session(含伺服器端檔案、客戶端 Cookie)
<?php
session_start();
unset($_SESSION['username']);  // 刪除單一
// session_unset();             // 刪除全部變數
session_destroy();             // 完全銷毀
?>

完整實作:會員登入/登出系統

資料庫設定 config.php

<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', 'your_password');
define('DB_NAME', 'test_db');
?>

登入頁 login.php

<?php
session_start();
require 'config.php';

$error_msg = '';

// 已登入直接導向會員頁
if (isset($_SESSION['user_id'])) {
    header('Location: logged.php');
    exit;
}

// 處理登入表單送出
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username'] ?? '');
    $password = trim($_POST['password'] ?? '');

    if ($username && $password) {
        $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        if ($mysqli->connect_errno) {
            die("資料庫連線失敗: " . $mysqli->connect_error);
        }

        // 使用預處理語句防止 SQL Injection
        $stmt = $mysqli->prepare("SELECT user_id, username, password FROM users WHERE username = ?");
        $stmt->bind_param("s", $username);
        $stmt->execute();
        $result = $stmt->get_result();

        if ($result->num_rows === 1) {
            $row = $result->fetch_assoc();
            // 假設密碼已用 password_hash() 加密
            if (password_verify($password, $row['password'])) {
                $_SESSION['user_id']   = $row['user_id'];
                $_SESSION['username']  = $row['username'];
                header('Location: logged.php');
                exit;
            }
        }
        $error_msg = '帳號或密碼錯誤';
        $stmt->close();
        $mysqli->close();
    } else {
        $error_msg = '請輸入帳號與密碼';
    }
}
?>
<!DOCTYPE html>
<html>
<head><title>登入</title></head>
<body>
<h2>會員登入</h2>
<?php if ($error_msg): ?><p style="color:red"><?= $error_msg ?></p><?php endif; ?>
<form method="post">
    帳號:<input type="text" name="username" value="<?= htmlspecialchars($username ?? '') ?>" required><br>
    密碼:<input type="password" name="password" required><br>
    <button type="submit">登入</button>
</form>
</body></html>

會員頁 logged.php

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}
?>
<!DOCTYPE html>
<html>
<body>
<h2>歡迎,<?= htmlspecialchars($_SESSION['username']) ?></h2>
<p>您的 User ID:<?= $_SESSION['user_id'] ?></p>
<a href="logout.php">登出</a>
</body></html>

登出處理 logout.php

<?php
session_start();

// 清空 session 陣列
$_SESSION = [];

// 刪除 session cookie
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// 徹底銷毀 session
session_destroy();

header('Location: login.php');
exit;
?>

安全性最佳實務

  • 密碼必須用 password_hash() / password_verify(),禁用 MD5/SHA1
  • 資料庫操作強制使用預處理語句
  • session_start() 前設定 session.cookie_httponly=1、session.cookie_secure=1 (HTTPS)
  • 重要操作前重新驗證身分(如修改密碼)
  • 實作 CSRF Token 保護表單
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved