如何修復PHP中的「標頭已發送」錯誤

運行腳本時,出現以下錯誤: php

警告:不能更改頭信息-已經( 輸出在/some/file.php:12開始 )在/some/file.php發送上線23程序員

錯誤消息中提到的行包含header()setcookie()調用。 cookie

這多是什麼緣由? 以及如何解決? session


#1樓

一個簡單的提示:在腳本中,就在第一個<?php標記以前的簡單空格(或不可見的特殊字符)會致使這種狀況! 尤爲是當您在團隊中工做且有人在使用「弱」 IDE或使用奇怪的文本編輯器弄亂了文件時。 框架

我看過這些東西;) 編輯器


#2樓

我以前曾屢次收到此錯誤,而且能夠確定全部PHP程序員至少一次收到過此錯誤。 函數

可能的解決方案1 spa

該錯誤多是由文件開頭以前或文件結尾以後的空格引發的。這些空格不該在此處。 code

例)這裏應該沒有空白 ip

echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

檢查與致使此錯誤的文件關聯的全部文件。

注意: 有時,像gedit(默認的Linux編輯器)之類的EDITOR(IDE)在保存文件上添加一個空行。 這不該該發生。 若是您使用的是Linux。 您可使用VI編輯器刪除頁面末尾?>以後的空格/行。

可能的解決方案2:若是不是您這種狀況,請使用ob_start輸出緩衝:

<?php
  ob_start();

  // code 

 ob_end_flush();
?>

這將打開輸出緩衝,而且將在緩衝頁面以後建立標題。


#3樓

代替下面的行

//header("Location:".ADMIN_URL."/index.php");

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

要麼

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

確定會解決您的問題。 我遇到了一樣的問題,但經過上述方式編寫標題位置解決了。


#4樓

另外一個很差的作法可能會引發此問題,還沒有說明。

請參見如下代碼段:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

事情還好吧?

若是「 a_important_file.php」是怎麼辦:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

這行不通嗎? 爲何?由於已經生成了新行。

如今,儘管這不是常見的狀況,可是若是您使用的是MVC框架,該框架會在將內容移交給控制器以前加載大量文件? 這並不是罕見的狀況。 爲此作好準備。

PSR-2 2.2開始:


  • 全部PHP文件都必須使用Unix LF (linefeed) line ending
  • 全部PHP文件都必須以single blank line結尾。
  • only php包含only php文件中必須omitted ?>標記

相信我,遵循這些標準能夠爲您節省不少時間:)


#5樓

一般,當咱們在回顯或打印後發送標題時,會出現此錯誤。 若是在特定頁面上發生此錯誤,請確保在調用start_session()以前該頁面沒有回顯任何內容。

不可預測的錯誤示例:

<?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

再舉一個例子:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

結論:在調用session_start()header()函數header()甚至是空格或換行符session_start()以前,請勿輸出任何字符

相關文章
相關標籤/搜索