在 PHP 開發中,Session 是實現用戶登入狀態保持的核心機制。相較於 Cookie,Session 將敏感數據存儲在伺服器端,僅透過 Session ID 在客戶端傳遞,安全性顯著更高。無論是會員系統、購物車還是後台管理,Session 都是不可或缺的工具。本文將透過完整的代碼範例,示範如何從資料庫連線、登入驗證、狀態檢查到登出銷毀,構建一套完整的 Session 登入機制。
本範例包含四個核心檔案,各司其職:
集中管理資料庫參數,方便維護與部署:
<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '19900101');
define('DB_NAME', 'test');
?>
登入頁面需在最開頭啟動 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 } ?>
所有需登入的頁面都必須啟動 Session 並驗證:
<?php
session_start();
if (isset($_SESSION['username'])) {
echo '歡迎,' . $_SESSION['username'] . '<br/>';
echo '<a href="logOut.php">登出</a>';
} else {
header('Location: logIn.php');
exit();
}
?>
登出需徹底清除 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');
?>
password_hash() 與 password_verify()mysqli_real_escape_string() 或預處理語句session_regenerate_id())若 Session 無法跨頁面保持,請檢查:
session_start()session.save_path 目錄是否可寫header() 或 session_start()掌握 Session 機制是 PHP 開發的基石,建議進一步學習 Session 安全配置、分散式 Session 儲存(Redis/Memcached)以及 OAuth 整合等進階主題。