經典新手坑:登錄頁寫入 $_SESSION['nickname'] 後跳轉到 default.php 讀取為空。代碼裡明明有 session_start(),為什麼不生效?
<?php
// 1.php 登錄成功後
session_start();
$_SESSION["nickname"] = "abc";
header("Location: default.php");
?>
// default.php 讀取
<?php
// session_start(); <-- 這裡被註釋掉了!
if (!isset($_SESSION["nickname"])) echo "session未設置";
else echo $_SESSION["nickname"];
?>
每個需要使用 Session 的 PHP 腳本都必須在輸出任何內容前調用 session_start()。 Session 數據存儲在服務端(默認文件),session_start() 會根據 Cookie 中的 PHPSESSID 找到對應的存儲文件並反序列化載入 $_SESSION 超全局變量。沒調用它,$_SESSION 就是空數組。
<?php
// 所有頁面頂部第一行,無輸出前
session_start();
// 設置 session 過期時間(可選)
ini_set('session.gc_maxlifetime', 3600);
session_set_cookie_params(3600);
// 然後才能讀寫 $_SESSION
?>
session_start() 前有空白行、BOM 頭、echo/printexit(),導致繼續執行輸出內容php.ini 中 session.save_path 目錄不可寫session.cookie_domainsession.use_trans_sid 或手動傳 SID)// 檢查 session 是否真正啟動
var_dump(session_status() === PHP_SESSION_ACTIVE);
// 查看 session 存儲路徑權限
var_dump(ini_get('session.save_path'));
// 強制顯示 session ID
echo session_id();
記住:Session 是服務端狀態,Cookie 只是鑰匙。每把鑰匙用前都要插進鎖孔(session_start)才能開門。