2012-04-17 153 views
3

我真的不知道問題在這裏。setcookie不刪除cookie

我有一個名爲「login.php」的腳本,完美地工作。這就是所謂的AJAX,如果它成功返回時,頁面刷新和用戶登錄,該Cookie設置頁面上

setcookie("main", $row[0], time() + 3600, "/") 

然後我就被稱爲「logout.php」的腳本。它被稱爲相同的方式(AJAX,然後頁面刷新)。它只有兩行:

<?php 
    setcookie("main", "", time() - 3600, "/"); 
    echo "Done"; 
?> 

調用它形成頁面不起作用,所以我只是在瀏覽器中加載logout.php。輸出「完成」,但在Chrome瀏覽器中檢查我的Cookie後,顯示cookie仍設置爲「1」($ row [0]),並在login.php中設置的時間到期。

login.php和logout.php都在同一個文件夾中,即根目錄,與其他所有文件夾相同。

此前,這是工作,但我所做的唯一更改是使網站上的標題欄自己的文件(仍在根目錄中),並採取註銷按鈕的JavaScript功能,這是隻需一個AJAX調用和一些jQuery懸停效果,並將其創建爲自己的腳本文件,該文件位於_js文件夾中。但我根本沒有更改logout.php,所以當我直接導航到它時它應該仍然有效,對吧?我的setcookie命令有什麼問題,或者其他問題可能導致它?

編輯:我試圖設置它在100秒而不是-3600過期,然後嘗試更改它的名稱,以便我可以將其識別爲完全單獨的cookie。他們都沒有出現。根本沒有設置cookie。

編輯2:我恢復到最後一次提交,並且一切都再次工作。我不知道爲什麼通過創建一些新文件來重新組織我的網站(logout.php根本沒有改變)會使某個腳本無法創建cookie。

+0

你確定你調用在同一個域?也許你設置www.domain.com Cookie,並要刪除它在domain.com上? – 2012-04-17 16:07:26

+0

我把它們都設置在「/」上,所以它應該是同樣的東西,對吧?它們都在同一個文件夾中 – 2012-04-17 16:09:36

+0

不,它是路徑,域可能不同。在www.domain.com上設置cookie比它無法從domain.com訪問,儘管他們是相同的域名,但理論上不是。因此,如果你在www.domain.com/login.php中設置域名,比註銷php腳本必須從www.domain.com/logout.php調用而不是domain.com/logout.php – 2012-04-17 16:10:30

回答

3

必須在任何內容發送到客戶端之前設置Cookie。確保在調用setcookie之前沒有向客戶端發送任何內容,因爲它實際上是通過請求返回的Set-Cookie標頭。

與include文件中的空間一樣小的東西可能會毀掉它。 (你說你在處理其他文件,檢查沒有包含任何東西,例如括號內的調試回聲或空白字符)

作爲一般的經驗法則,如果我有一個PHP代碼專用的文件我只包含開始標記(<?php)並免除最後一個標記。 PHP仍然會解析並運行,但這樣可以避免文件末尾有可能會出現問題的空白。例如

mycodefile.php

<?php 

    define('...', ...); 

    function ...(){ } 

另外,你提到使用Chrome。打開你的調試器中鉻(CTRL + SHFT +),然後單擊網絡標籤。然後找到您的登出電話並選擇它,然後單擊標頭並驗證您的Cookie正在清除。(同樣可以點擊資源餅乾看,查看任何一組。

+0

是的,我同意,如果在<?php標記之前有空格或換行符,這將是原因。 – 2012-04-17 16:08:06

+0

logout.php就是這兩行,所以我不認爲在setcookie被調用之前,如果我直接導​​航到該頁面,任何事情都不會被髮送到客戶端。沒有任何空格,只有setcookie之前的選項卡。 – 2012-04-17 16:08:19