header("Location:loginphp")應該注意的幾個問題 header("Location:")作為php的轉向語句其實在使用中他有幾點需要注意的地方
要求header前沒有任何輸出
但是很多時候在header前我們已經輸出了好多東西了此時如果再次header的話顯然是出錯的在這裡我們啟用了一個ob的概念ob的意思是在服務器端先存儲有關輸出等待適當的時機再輸出而不是像現在這樣運行一句輸出一句發現header語句就只能報錯了
具體的語句有 ob_start(); ob_end_clean();ob_flush();
在header("Location:")後要及時exit
否則他是會繼續執行的雖然在浏覽器端你看不到相應的數據出現但是如果你進行抓包分析的話你就會看到下面的語句也是在執行的而且被輸送到了浏覽器客戶端只不過是沒有被浏覽器執行為html而已(浏覽器執行了header進行了轉向操作)
所以標准的使用方法是
ob_start();
if ( something ){
ob_end_clean();
header("Location: yourlocation");
exit;
else{
ob_flush(); //可省略
要想在header前有輸出的話可以修改phpini文件
output_handler =mb_output_handler
或 output_handler =on
Output Control 函數可以讓你自由控制腳本中數據的輸出它非常地有用特別是對於當你想在數據已經輸出後再輸出文件頭的情況輸出控制函數不對使用 header() 或 setcookie() 發送的文件頭信息產生影響只對那些類似於 echo() 和 PHP 代碼的數據塊有作用
一 相關函數簡介
Flush刷新緩沖區的內容輸出
函數格式flush()
說明這個函數經常使用效率很高
ob_start 打開輸出緩沖區
函數格式void ob_start(void)
說明當緩沖區激活時所有來自PHP程序的非文件頭信息均不會發送而是保存在內部緩沖區為了輸出緩沖區的內容可以使用ob_end_flush()或flush()輸出緩沖區的內容
ob_get_contents 返回內部緩沖區的內容
使用方法string ob_get_contents(void)
說明這個函數會返回當前緩沖區中的內容如果輸出緩沖區沒有激活則返回 FALSE
ob_get_length返回內部緩沖區的長度
使用方法int ob_get_length(void)
說明這個函數會返回當前緩沖區中的長度;和ob_get_contents一樣如果輸出緩沖區沒有激活則返回 FALSE
ob_end_flush 發送內部緩沖區的內容到浏覽器並且關閉輸出緩沖區
使用方法void ob_end_flush(void)
說明這個函數發送輸出緩沖區的內容(如果有的話)
ob_end_clean刪除內部緩沖區的內容並且關閉內部緩沖區
使用方法void ob_end_clean(void)
說明這個函數不會輸出內部緩沖區的內容而是把它刪除!
ob_implicit_flush打開或關閉絕對刷新
使用方法void ob_implicit_flush ([int flag])
說明使用過Perl的人都知道$|=x的意義這個字符串可以打開/關閉緩沖區而ob_implicit_flush函數也和那個一樣默認為關閉緩沖區打開絕對輸出後每個腳本輸出都直接發送到浏覽器不再需要調用 flush()
ob_start() 開始輸出緩沖 這時PHP停止輸出 在這以後的輸出都被轉到一個內部的緩沖裡
ob_get_contents() 這個函數返回內部緩沖的內容 這就等於把這些輸出都變成了字符串
ob_get_ length() 返回內部緩沖的長度
ob_end_flush() 結束輸出緩沖 並輸出緩沖裡的內容 在這以後的輸出都是正常輸出
ob_end_clean() 結束輸出緩沖 並扔掉緩沖裡的內容
舉個例子 var_dump()函數輸出一個變量的結構和內容 這在調試的時候很有用
但如果變量的內容裡有 < > 等HTML的特殊字符 輸出到網頁裡就看不見了 怎麼辦呢?
用輸出緩沖函數能很容易的解決這個問題
ob_start();
var_dump($var);
$out = ob_get_contents();
ob_end_clean();
這時var_dump()的輸出已經存在 $out 裡了 你可以現在就輸出:
echo </pre> htmlspecialchars($out) </pre> ;
或者等到將來 再或者把這個字符串送到模板(Template)裡再輸出
From:http://tw.wingwit.com/Article/program/PHP/201311/21169.html