首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP Session 多頁面共享失效?90% 是漏寫了 session_start()

     編輯:程式設計綜合問答

經典新手坑:登錄頁寫入 $_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/print
  • ❌ 跳轉前沒 exit(),導致繼續執行輸出內容
  • ❌ php.ini 中 session.save_path 目錄不可寫
  • ❌ 跨域/子域名共享未設置 session.cookie_domain
  • ❌ 瀏覽器禁用 Cookie(需開啟 session.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)才能開門。

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