よくあるPHP エラー Warning: Cannot modify header information - headers already sent by


前回のブログに続いて、よくあるPHP エラーについて書いてみます。

Warning: Cannot modify header information - headers already sent by

こんな感じのエラーって見たことありませんか?



PHPで便利な関数

header("Location: xxxxx.php");

を初めて使うと、よく特定のミスをします。

その時に、こんな感じのエラーが出てきます。



・・・で、原因をネットで調べると、

header関数は、HTMLを出力した後には使えません。

っていう解説が出てくると思います。



でも、スクリプト初心者だと、この説明では、いまいちピンとこないんですよね。



header関数の前にやってはいけない事をいくつか書いてみます。


・HTMLファイルの最初に改行を入れてはダメです。

これはテキストエディタ上での改行です。ブラウザに表示した状態での改行ではないので、注意してください。

UTF-8の場合、「BOMあり」にしてはいけない。

ファイルの文字エンコードUTF-8にすると、「BOMあり」と「BOMなし」というものを選べます。

「BOMあり」にすると、ファイルの最初に「BOM」っていうものが入ってしまう為、header関数でエラーが発生します。

※選べない場合は、選べるテキストエディタを使用してください。

・header関数の前にHTMLを書いてはいけない

これは、ブラウザに表示する部分を書いてはいけないという意味ではなく、HTMLの宣言(
<!DOCTYPE html>)も含め、

書いてはいけないという事です。

なので、ファイルの最初は、

<?php
header("Location:〜

と始まります。

※これ以外の書き方もあります。

header関数の前にPHPのechoなどでHTMLを出力してはいけない

これも、HTMLを書いているのと同じなので、エラーになってしまいます。




header関数の前にやっても良い事も書いてみます。

・変数に文字列などを格納する

$a="aaa";

の様に文字列を格納するだけなら、HTMLを出力しているわけではないので大丈夫です。

・includeしたファイルで、
header関数を使用する。

ログインしていない場合、ログイン画面に飛ばす。とかのスクリプトにしたい場合、

ページごとに設定していたら、大変です。

なので、スクリプトをひとつのファイルにまとめて、includeしてもOKです。

ただし、includeする前に、HTMLを出力していれば、同様にエラーが発生します。


条件分岐(if構文など)やその他、HTMLを出力しないPHPを使用する。

header関数は、前にHTMLさえ出力していなければ、基本的には使用出来るはずです。

例えば、フォームで送った内容をデータベースに登録して、登録に成功したらメールを送って、メール送信に成功したら、header関数で「成功しました」って表示するページに移動させる。とかも出来ます。