早期 PHP 開發中,跨頁面保持用戶登入狀態是核心挑戰。本文對比三種主流方案的實作細節、優缺點與適用場景,附完整可執行程式碼。
<!-- test4.php 登入處理頁 -->
<?php
$username = "張小明"; // 假設驗證通過
?>
<form action="test5.php" method="POST">
<input type="hidden" name="username" value="<?php echo htmlspecialchars($username); ?>">
<input type="submit" value="進入會員區">
</form>
<!-- test5.php 目標頁 -->
<?php
echo "你好, " . htmlspecialchars($_POST['username']) . ",歡迎光臨!";
?>
缺點:每次跳轉需提交表單,刷新頁面會丟失資料,不適合多頁應用。
<!-- test6.php 登入建立 Session -->
<?php
session_start(); // 必須在輸出前調用,前面不能有任何空白字元
session_register("username"); // PHP 4 風格,PHP 5+ 建議直接 $_SESSION['username'] = ...
$username = "張小明";
echo '<a href="test7.php">去看看</a>';
?>
<!-- test7.php 讀取 Session -->
<?php
session_start();
echo "你好, " . htmlspecialchars($_SESSION['username']) . ",歡迎光臨!";
?>
跨視窗傳遞 Session ID:
<!-- test8.php -->
<?php
session_start();
session_register("username");
$username = "張小明";
$sid = session_id();
echo '<a href="test7.php?' . SID . '" target="_blank">新視窗查看</a>';
// SID 常數自動展開為 "PHPSESSID=xxx" (僅當 Cookie 被禁用時)
?>
<!-- test9.php 設定 Cookie -->
<?php
// 有效期 1 小時,路徑為全站
setcookie("username", "張小明", time()+3600, "/");
echo '<a href="test5.php">去看看</a>';
?>
<!-- test5.php 讀取 Cookie -->
<?php
if (isset($_COOKIE['username'])) {
echo "你好, " . htmlspecialchars($_COOKIE['username']) . ",歡迎光臨!";
} else {
echo "未檢測到登入 Cookie";
}
?>
| 維度 | 隱藏表單 | Session | Cookie |
|---|---|---|---|
| 儲存位置 | 客戶端 (HTML) | 伺服器端 (檔案/資料庫) | 客戶端 (瀏覽器) |
| 安全性 | 低 (可被篡改) | 高 (敏感資料不出伺服器) | 中 (需加密敏感欄位) |
| 持久性 | 單次請求 | 瀏覽器關閉失效 (可配置) | 可設定過期時間 |
| 跨域支援 | 困難 | 需共享儲存介質 | 原生支援 (同域) |
| 適用場景 | 簡單單次跳轉 | 用戶登入、購物車、多步驟流程 | 記住我、偏好設定、追蹤分析 |
- 登入狀態:Session + 安全 Cookie (HttpOnly, Secure, SameSite)
- 長期記住:加密 Cookie + 資料庫 Token 驗證
- 分散式系統:Redis/Memcached 集中式 Session 儲存
- API 無狀態:JWT (JSON Web Token) 替代傳統 Session