TShopping

 找回密碼
 註冊
搜索
查看: 2220|回復: 0
打印 上一主題 下一主題

[教學] Cannot modify header information - headers already sent by...

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-5-17 18:58:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
在寫 PHP 程式用到 header 函數轉換網頁時經常會看到
Warning: Cannot modify header information -
headers already sent by (output started at xxx/xxx.php:2) in xxx/xxx.php on line 2

尤其對於從 PHP4 (或更早版本) 升級成 PHP5 後
突如其來的一大串英文錯誤 (都是英文吧= =) 感到困惑

先前所敘述的錯誤訊息會在以下情況發生
(1) 程式在 header 前就送出資料 (錯誤訊息的意思就是指這個)
(2) 程式文件編碼問題


(1)的解決辦法很簡單,在 PHP 的官方說明文件就有提到
你可以在程式中加入兩個程式碼,或修改 php.ini 的設定

1. 加入 ob_start() 及 ob_end_flush() 程式

當程式中包含 header.....

<?

function xxx(){
    ....  //這邊放上你的程式
    header("Location: http://hkc.tw/");
}

ob_start();
?>

輸出的 HTML

<?
ob_end_flush();
?>

2. 修改 php.ini 的 output_buffering 為 on

這樣可以免除後患~~


(2)的問題就很懸了,如果你的 header 就算只有單單的一行

<? header("Location: 你的網址"); ?>

而且是放在文件最頂端,但怎麼試都是錯誤
你就要查查看你的文件編碼了
你可以用「記事本」開啟你的文件
然後點「檔案」→「另存新檔」,跳出儲存檔案對話方塊
看下面的編碼,如果不是 ANSI 的話就把它改成 ANSI 吧!
這樣就可以了^^

PHP 設計人員都知道,使用 setcookie() 或 session_start() 函式之前不能有任何輸出,否則就會出現錯誤。這是因為這兩個函式呼叫後會將資訊加入 HTML 的標頭(Header),而標頭都應該在 HTML 本體(body)輸出之前,如果呼叫這兩個函式時前面已經有東西輸出了,PHP 直譯器就會出現錯誤訊息。然而要檢查函式呼叫之前有沒有輸出是件非常麻煩的事情 ,因為 include 檔案內容裡的輸出都有可能造成錯誤,如果檔案數龐大,那檢查起來可是非常麻煩的,在此提供一個可以一勞永逸的方法:

開啟組態設定檔 php.ini ,將底下這項改為 On
output_buffering = On

這樣 Web Server 在處理檔案時會將標頭全部處理完後,再輸出網頁內容,這樣網頁速度需多等千分之一秒,但卻可省去檢查程式碼的數千數萬秒,算是值得使用的功能囉!

或是在  網頁目錄下.htaccess加程式碼
如沒此檔自己建此檔
加入此程式碼

PHP_FLAG output_buffering On

這樣就搞定嚕

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-30 09:16 , Processed in 0.068190 second(s), 18 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表