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

PHP Session 實作用戶登入狀態保持完整教學

     編輯:PHP 相關知識

PHP Session 實作用戶登入狀態保持完整教學

在 PHP 開發中,Session 是實現用戶登入狀態保持的核心機制。相較於 Cookie,Session 將敏感數據存儲在伺服器端,僅透過 Session ID 在客戶端傳遞,安全性顯著更高。無論是會員系統、購物車還是後台管理,Session 都是不可或缺的工具。本文將透過完整的代碼範例,示範如何從資料庫連線、登入驗證、狀態檢查到登出銷毀,構建一套完整的 Session 登入機制。

核心檔案架構

本範例包含四個核心檔案,各司其職:

  • connectvars.php - 資料庫連線配置
  • logIn.php - 登入表單與驗證邏輯
  • loged.php - 登入後的會員頁面
  • logOut.php - 登出與 Session 銷毀

1. 資料庫連線配置 (connectvars.php)

集中管理資料庫參數,方便維護與部署:

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

2. 登入驗證邏輯 (logIn.php)

登入頁面需在最開頭啟動 Session,並檢查用戶是否已登入:

<?php
require_once 'connectvars.php';
session_start();

$error_msg = "";
if (!isset($_SESSION['user_id'])) {
    if (isset($_POST['submit'])) {
        $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        $username = mysqli_real_escape_string($dbc, trim($_POST['username']));
        $password = mysqli_real_escape_string($dbc, trim($_POST['password']));

        if (!empty($username) && !empty($password)) {
            // 使用 SHA() 加密密碼查詢
            $query = "SELECT user_id, username FROM mismatch_user 
                      WHERE username = '$username' AND password = SHA('$password')";
            $data = mysqli_query($dbc, $query);

            if (mysqli_num_rows($data) == 1) {
                $row = mysqli_fetch_array($data);
                $_SESSION['user_id'] = $row['user_id'];
                $_SESSION['username'] = $row['username'];
                header('Location: loged.php');
                exit();
            } else {
                $error_msg = '帳號或密碼錯誤,請重新輸入。';
            }
        } else {
            $error_msg = '請輸入帳號與密碼。';
        }
    }
} else {
    header('Location: loged.php');
    exit();
}
?>

HTML 表單部分根據 Session 狀態決定是否顯示:

<?php if (!isset($_SESSION['user_id'])) { ?>
    <p class="error"><?php echo $error_msg; ?></p>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <label>帳號: <input type="text" name="username" value="<?php echo isset($username) ? $username : ''; ?>" /></label>
        <label>密碼: <input type="password" name="password" /></label>
        <input type="submit" name="submit" value="登入" />
    </form>
<?php } ?>

3. 會員頁面驗證 (loged.php)

所有需登入的頁面都必須啟動 Session 並驗證:

<?php
session_start();
if (isset($_SESSION['username'])) {
    echo '歡迎,' . $_SESSION['username'] . '<br/>';
    echo '<a href="logOut.php">登出</a>';
} else {
    header('Location: logIn.php');
    exit();
}
?>

4. 完整登出機制 (logOut.php)

登出需徹底清除 Session 數據與 Cookie:

<?php
session_start();
if (isset($_SESSION['user_id'])) {
    $_SESSION = array(); // 清空所有 Session 變數
    
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 3600); // 刪除 Session Cookie
    }
    
    session_destroy(); // 銷毀 Session
}
header('Location: logIn.php');
?>

關鍵安全要點

  1. 密碼加密:範例使用 MySQL SHA(),實務上建議使用 PHP password_hash() 與 password_verify()
  2. SQL 注入防護:使用 mysqli_real_escape_string() 或預處理語句
  3. Session 劫持防護:定期重新生成 Session ID (session_regenerate_id())
  4. HTTPS 傳輸:生產環境強制使用 HTTPS 保護 Session ID 傳輸

常見問題排查

若 Session 無法跨頁面保持,請檢查:

  • 所有頁面頂端是否都有 session_start()
  • php.ini 中 session.save_path 目錄是否可寫
  • 是否在輸出內容前呼叫 header() 或 session_start()
  • 瀏覽器是否啟用 Cookie(Session 預設靠 Cookie 傳遞 ID)

掌握 Session 機制是 PHP 開發的基石,建議進一步學習 Session 安全配置、分散式 Session 儲存(Redis/Memcached)以及 OAuth 整合等進階主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved