首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 常見錯誤與除錯完整指南

     編輯:PHP 相關知識

十大 Session 問題情境與解決方案

Q1:Headers already sent 錯誤

錯誤訊息:Warning: Cannot send session cookie - headers already sent

原因:在呼叫 session_start() 之前已有實際輸出(包括 echo、print、HTML 空白字元、BOM 標記等)。

解決:將 session_start() 移至程式最第一行,確保之前無任何輸出。

Q2:Session 儲存路徑設定錯誤

錯誤訊息:Warning: open(F:/689\php\sessiondata\sess_..., O_RDWR) failed

原因:php.ini 中 session.save_path 未正確設定或目錄不存在/不可寫入。

解決:設定有效路徑並建立目錄:

session.save_path = "C:\temp"
session.cookie_path = "C:\temp"

並在 C:\ 下建立 temp 目錄,確保 Web 伺服器進程有讀寫權限。

Q3:嘗試銷毀未初始化的 Session

錯誤訊息:Warning: Trying to destroy uninitialized session

原因:直接呼叫 session_destroy() 而未先啟動 Session。

解決:銷毀前必須先呼叫 session_start()。

Q4:取得目前 Session ID

最簡單方式:echo SID; 或 session_id() 函數。

Q5:Include 檔案尾端的隱形空白字元

即使主程式與 include 檔案看似無輸出,但檔案結尾 ?> 後的空行、空格也會被視為輸出。解決方法:刪除結尾標記後的空白,或直接省略 PHP 結尾標記(建議做法)。

Q6:跨頁面登入狀態驗證

session_start();
if (!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
    echo "您尚未登入";
    exit;
}

註:session_is_registered() 已棄用,請改用 isset($_SESSION['key'])。

Q7:Header 重導向導致 Session 變數遺失

現象:註冊 Session 變數後立即 header("Location: ..."),目標頁面讀不到該變數。

解決:在重導向 URL 附加 Session ID:

header("Location: next.php?" . SID);

或確保 session_write_close() 在重導向前被呼叫以刷新 Session 資料。

Q8:Session 儲存陣列

session_start();
$_SESSION['data'] = array(1, 2, 3, 4); // 直接賦值即可,PHP 5.4+ 建議用 $_SESSION

Q9:透過超全域陣列存取 Session

可使用 $_SESSION(推薦)或 $HTTP_SESSION_VARS(舊式,已棄用)。

Q10:session_unregister() vs session_destroy()

  • session_unregister('var'):僅移除單一 Session 變數(已棄用,請用 unset($_SESSION['var']))。
  • session_destroy():銷毀整個 Session 環境,包含伺服器端儲存檔案。注意:若當前頁面曾用 $_SESSION 存取,建議搭配 unset($_SESSION) 並清除 Cookie:
if (isset($_COOKIE[session_name()])) {
    session_start();
    session_destroy();
    unset($_COOKIE[session_name()]);
    setcookie(session_name(), '', time()-3600, '/');
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved