錯誤訊息:Warning: Cannot send session cookie - headers already sent
原因:在呼叫 session_start() 之前已有實際輸出(包括 echo、print、HTML 空白字元、BOM 標記等)。
解決:將 session_start() 移至程式最第一行,確保之前無任何輸出。
錯誤訊息: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 伺服器進程有讀寫權限。
錯誤訊息:Warning: Trying to destroy uninitialized session
原因:直接呼叫 session_destroy() 而未先啟動 Session。
解決:銷毀前必須先呼叫 session_start()。
最簡單方式:echo SID; 或 session_id() 函數。
即使主程式與 include 檔案看似無輸出,但檔案結尾 ?> 後的空行、空格也會被視為輸出。解決方法:刪除結尾標記後的空白,或直接省略 PHP 結尾標記(建議做法)。
session_start();
if (!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
echo "您尚未登入";
exit;
}
註:session_is_registered() 已棄用,請改用 isset($_SESSION['key'])。
現象:註冊 Session 變數後立即 header("Location: ..."),目標頁面讀不到該變數。
解決:在重導向 URL 附加 Session ID:
header("Location: next.php?" . SID);
或確保 session_write_close() 在重導向前被呼叫以刷新 Session 資料。
session_start();
$_SESSION['data'] = array(1, 2, 3, 4); // 直接賦值即可,PHP 5.4+ 建議用 $_SESSION
可使用 $_SESSION(推薦)或 $HTTP_SESSION_VARS(舊式,已棄用)。
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, '/');
}