近期做一個網站的投票時,遇到ThinkPHP中的cookie和session衝突導致Cookie不能使用的情況。
該網站採用的是ThinkPHP架構製作,有一頁面上面展示很多圖片,要求每個圖片下面有對應的投票,通過限制ip地址來,限制遊客在一定時間範圍內,能對多個圖片投票,但是每個圖片只能投票一次,開始使用ip儲存在資料庫解決,後來改進為使用session儲存,ip在服務檔案裡,不過要把產生的sessionid儲存在本地的cookie中,按照ThinkPHP手冊說明操作session一切順利,但是在產生cookie之後,卻在本地電腦中找不到cookie文本,原本以為是本地電腦限制cookie的產生,可是查看和測試的結果是沒有限制,於是自己又單獨建立了一個php檔案,測試產生cookie,沒問題,在本地找到了cookie文本,於是在網上尋找到如下內容。順序解決了問題,使用setcookie()函數設定cookie,得到了想要的結果。
解決辦法如下:
找到php.ini 這個設定檔,然後尋找一項:
output_buffering將其值由原來的off改為on,重新啟動Apache就ok了。
另外還有很多相似的問題:
有些時候會發現原在本地運行沒有問題的檔案,在伺服器上測試時,竟然提示本地沒有出現的錯誤: Warning: Cannot modify header information - headers already sent by…
這樣的語句,很顯然,造成這個原因是因為setcookie造成的,查了一下網上,有如下的解釋: cookie本身在使用上有一些限制,例如:
1.呼叫setcookie的敘述必須放在標籤之前
2.呼叫setcookie之前,不可使用echo
3.直到網頁被重新載入後,cookie才會在程式中出現
4.setcookie函數必須在任何資料輸出至瀏覽器前,就先送出
基於上面這些限制,所以執行setcookie()函數時,常會碰到“Undefined index”、“Cannot modify header information - headers already sent by”…等問題,解決“Cannot modify header information - headers already sent by”這個錯誤的方法是在產生cookie前,先延緩資料輸出至瀏覽器,因此,您可以在程式的最前方加上ob_start()這個函數。這樣問題就可以解決了。 但是如果要加上ob_start()的話,有不大可行,程式都寫完了,才來改這個似乎有點鬱悶!發現提示這個錯誤的時候,我就在想我本地怎麼沒提示這個問題呢,還以為是PHP.ini配置不一樣,想想又不對,都是差不多的。於是看看後面跟的那句“output started at…”意思是在setcookie之前已經在另一處有輸出了,於是找到output started at後面跟的那個檔案,最後發現第一行是空白的。
http://www.bkjia.com/PHPjc/824685.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/824685.htmlTechArticle近期做一個網站的投票時,遇到ThinkPHP中的cookie和session衝突導致Cookie不能使用的情況。 該網站採用的是ThinkPHP架構製作,有一頁面上面展示...