0

私はphpでこの警告を受けました:

Cannot modify header information - headers already sent by (output started at

mysql、apache、およびphpを別々にインストールしたが、Wampを使用している場合、警告は存在せず、ページは正常にリダイレクトされます。

警告ではなくエラーのみを表示するようにエラーレポートを設定しようとしましたが、警告は表示されませんでしたが、ページもリダイレクトされませんでした。

これはすでに悪い習慣と見なされていることは知っていますが、私のコードベースにはこれらのコードがたくさんあり、それらをすべて変更すると、コードに新しいバグが発生する可能性があります。PHPでこの警告を完全に無視する方法はありますか?

4

5 に答える 5

3

この問題を回避し、無視しない古典的な方法は、出力バッファリング、ob_start() および ob_flush() を使用することです。出力の前にバッファリングを開始し、フラッシュで明示的に終了するか、自動的に終了する場合があります。これは、出力を印刷するのではなくキャプチャするため、出力されるヘッダーは、表示されるコンテンツの前に行われます。

エラーメッセージにあったファイル名から出力されるバグを修正するのが、これを修正する最良の方法です。?>不要な場合は、ファイルから終了 ' ' を削除すると役立つ場合があります。

于 2012-04-13T09:54:57.660 に答える
1

これは恐ろしい習慣ですが、設定しただけです

error_reporting(0);

スクリプトの最初に。それ以外の場合は、php.iniで設定します

display_errors = Off

編集-おそらくリダイレ​​クトの前に何かを出力しています。私はかつてこれをデバッグするのに3日間を費やしましたが、その理由は、ファイルの最後に空白があるか、リダイレクトの前にブラウザーにHTMLを出力したことが原因である場合があります。
私は通常、これを避けるためにphpタグを閉じることはありません

于 2012-04-13T09:47:03.557 に答える
1

エラーを表示しない場合でも、アプリケーションは機能しません。これは、ヘッダーが既に送信されているというエラーが表示されたためです。これが意味することは次のとおりです。ブラウザがサーバーで php ファイルを要求します。サーバーはこれを実行し、結果の html を返します。このエラーは、php ファイルの結果を送信した後で、ブラウザに何かを送信していることを示しています。したがって、エラーを表示しないだけでなく、エラーを修正することをお勧めします。

于 2012-04-13T09:50:40.030 に答える
1

この警告「無視」してリダイレクトすることはできません。警告ははっきりと言っています:

ヘッダーを送信できません! ヘッダーはすでに出力で送信されています!

これは、ヘッダー (Location出力が既に送信されているため、ヘッダーを送信できません) を意味します (ヘッダーは、すべての出力の前にのみ送信できます)。

RTMしてください。バグを無視するのではなく、修正する必要があります。


このエラーは、関数が呼び出される前に何らかの出力を送信したことが原因で発生しますheader()。その理由は、多くのことが考えられます。予期しない場合、すぐに疑われるのはファイルの先頭または末尾の空白です。

 <?php //Note the space before the opening tag!
header("Location: this-will-fail.html");
?>
于 2012-04-13T09:51:21.880 に答える
0

このエラーは、ブラウザへのデータ出力を開始したコード内の正確な場所を示していることに注意してください ( を参照してoutput started at ...1、末尾の空白文字 \r、\n、タブ、およびスペースを探してください)。理論的には、エラー報告をオフにしてもページがリダイレクトされることはありません。これは、ヘッダーが既に送信されており、変更または追加できないためです。

送信済みのデータをリダイレクトする必要がある場合は、次のようにします。

if ( headers_sent() )    // Check if the headers were already sent
{
    echo( "<script>document.location.href='$url';</script>" );  // Use client side redirect
    die();  // Stop here
}
else
{
    header( "Location: $url" );  // Use server side redirect
}

しかし、最善の方法は、出力が開始された場所を見つけて、それを修正することです (可能であれば)。

于 2012-04-13T09:54:19.610 に答える