2011-11-14 38 views
0

清除歷史,我想建立一個會話管理與PHP餅乾後第一次設置。 我的代碼如下:Cookie不能在Firefox

if(empty($_COOKIE)) { 
    setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT)); 
    } 
    $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0; 

我會再檢查SESSION_ID爲0,如果禁用cookie打印錯誤消息。 這工作正常,如果cookie真的被禁用。

問題是,如果用戶在第一次訪問 網站時清除了他的歷史記錄,即使啓用了cookie,他也會收到錯誤消息。

任何人對此有任何線索? 預先感謝您

回答

1

當你做對的setcookie呼叫,當標題輸出到瀏覽器的cookie將被髮送。這意味着在下一頁加載(當客戶端將cookie發回服務器時),cookie將不可用。這是在php手冊中提到的setcookie http://php.net/manual/en/function.setcookie.php

setcookie()定義了一個cookie,與其餘的HTTP頭一起發送。像其他標題一樣,Cookie必須在腳本輸出之前發送(這是協議限制)。這要求您在任何輸出之前調用此函數,包括標記以及任何空格。

一旦餅乾已經確定,就可以把他們下次訪問該頁面加載與$ _COOKIE或$ HTTP_COOKIE_VARS數組。請注意,像$ _COOKIE這樣的超全球變量可以在PHP 4.1.0中使用。 Cookie值也存在於$ _REQUEST中。

您將無法確定cookie是否啓用/禁用,直到頁面重新加載(來自php)。我認爲你將不得不這樣做與javascript檢查,或留在PHP做第一次設置cookie後的重定向,如:

if(empty($_COOKIE)) { 
      if (isset($_GET['cookieset'])) { 
        // do error message, cookie should be set 
      } 
      setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT)); 
      header('location: http://mysite.com/index.php?cookieset=1'); 
      exit; 
    } 
    $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0; 
+0

這個問題是,如果禁用cookie的用戶將始終重定向到的index.php - 因此陷入了一種循環。反正有沒有使用$ _GET變量進行檢查? – user1045922

+0

你不必重定向到的index.php,你可以重定向到使用$ _ SERVER [「REQUEST_URI」]來獲得頁面的用戶目前已對當前頁面。或者我說過要將錯誤重定向到顯示錯誤的其他頁面,或顯示錯誤並停止處理。這取決於你想要做什麼。 – bencoder

0

@bencoder:我已經在iPad上做了測試和Chrome/PC:你是對的iPad,你需要刷新頁面,您可以讀取cookie數據之前,而Chrome/PC上刪除所有cookie後,如果您設置PHP一個新的,可以完美得該值直接在第一頁加載。爲什麼?必須有更精確的解釋。爲什麼兩種不同的行爲此輸出/數據可用性的順序是否取決於瀏覽器對服務器的請求?有趣的是知道......