よくある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関数で「成功しました」って表示するページに移動させる。とかも出来ます。