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 保護表單