cookie存在客戶端,跟服務器沒有關系的,注意你程序裡大小寫問題,linux是大小寫敏感的,還有php教程的配置,比如是否 register_globals = Off 的配置在兩邊都一樣等等。
PHP 的 @、# 符號的意思
function foo($n)
{
$result = 1/$n;
return $result;
}
echo @foo(0); // 函數中會產生除 0 錯誤,但加上 @ 後並不顯示該錯誤。
echo "end"; // 輸出 end
# 注釋符號
同 // 一樣,# 是單行注釋符(多行注釋符為 /* */)。
由於使用了@setcookie,即便在寫入cookies是發生錯誤,也不會輸出,造成了無法發現問題。最後把@setcookie改成 setcookie,程序輸出如下錯誤信息:
Warning: Cannot modify header information - headers already sent by (output started at
經過上網一查,發現原來在進行setcookie設置前不能有任何輸出內容,然後就去檢查代碼,也沒有發現在setcookie之前輸出了東西,在搜索了一下,發現了問題所在,具體內容如下:
今天在WordPress中文論壇逛了一圈。壇子裡人氣不高,不過還是有很多高手的。會編寫插件和模版的高手和連編輯文件都不會的初學者混在一起,論壇就是這樣,哈哈。
看到好幾個帖子裡提到同一個錯誤,比如這個帖子裡提到的:"Warning: Cannot modify header information - headers already sent by (output started at c:program fileseasyphp1-8wwwwp-config.php:1) in c:program fileseasyphp1-8wwwwp-login.php on line 9"
這是一個很典型的問題。WordPress的程序執行時會首先調用wp-config.php一類的配置文件,也會調用wp-db.php建立數據庫教程連接以備後用。這些文件只是做一些設置,並不輸出html代碼。設置完了後,程序本身開始執行了,有些程序會使用header命令設置一個HTTP頭。由於HTTP頭必須在html代碼輸出之前設置好,否則html代碼已經開始往客戶端發送了,HTTP也就已經發送過了,沒法追回來重新設置了。WordPress CodeX裡對這個問題作出了說明:《How do I solve the Headers already sent warning problem?》。文章指出:要確保各個文件——尤其是經常被編輯的wp-config.php文件——以<?php開頭,以?>結尾,前後不能有其他字符。具體到上面的例子,很明顯,提示信息說wp-config.php的第一行就開始了html輸出,這有可能是第一行的<?php部分前面被加上的其他字符,比如空格一類的。再聯想到以前提到的BOM的問題,那麼非常有可能是因為這位朋友使用了Windows的記事本編輯了wp-config.php文件並保存成了UTF-8編碼的文檔,從而因為BOM的三個字符的輸出造成了header命令執行出錯。
解決方法
WordPress中文論壇沒有提供全文搜索的功能,只能搜索標題,所以我用Google搜索了一下Cannot modify header information site:wordpress.org.cn,好像碰到這個問題的人還真不少。目前大家用的WordPress主要是WordPress英文原版和幾個WordPress中文版。我的中文包又不包含wp-config-sample.php文件,自然不關我的事;WordPress原版用的ASCII碼,自然不包含BOM,也不會出這樣的錯誤;xigang制作的WordPress中文版在WordPress中文論壇有下,我去下載了WordPress 2.0.4和2.0.3這兩個,檢查了一下,沒有問題;點點游的WordPress 2.0.4中文版裡,wp-config-sample.php文件用的是GB2312編碼和DOS行尾符,GOD!不過這樣也好,如果有人用記事本修改了這個文件,DOS行尾符不會造成編輯問題,GB2312編碼不會造成BOM的問題
cookie用法
關於刪除cookie的說明開始-----
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
要刪除cookie需要確保它的失效期是在過去,才能觸發浏覽器的刪除機制。
下面的例子說明了如何刪除剛才設置的cookie:
<?php
//將過期時間設為一小時前
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
?>
-----關於刪除cookie的說明結束-----
刪除一個cookie的方法就是把這個cookie的有效期設置為當前時間以前,這也是幾乎所有php程序員都會這麼做。
後來一個初接觸php的朋友告訴我,他在程序中本想把一個cookie的值設置為空,結果導致這個cookie直接被刪除。我當時的第一反應是不相信,於是測試
了一下:
setcookie("testcookie", '');
print_r($_COOKIE);
結果果然是整個$_COOKIE數組都是空的,而非僅僅$_COOKIE['testcookie']為空。於是用winsock抓包,觀察返回的http頭,發現http頭竟然是“Set-Cookie: testcookie=deleted; expires=Mon, 18-Jun-2007 02:42:33 GMT”,這說明“setcookie("testcookie", '');”的的確確是將testcookie這個cookie直接刪除,而關於這種情況在php手冊中完全沒有說明。