制作会社から制作会社じゃない会社に転職が決まりました。制作会社で学んだことを残らず記事にしたいと思います。

パンDKOTORI Blogの公式キャラクター「パンD」です。
コーディングPHP「Warning: Cannot modify header information…」エラーの解決方法[PHP]

「Warning: Cannot modify header information…」エラーの解決方法[PHP]

2014年01月20日PHP 
「Warning: Cannot modify header information…」エラーの解決方法[PHP]記事のアイキャッチ画像

PHPで「header()」関数を使用したら「Warning: Cannot modify header information – headers already sent by ・・・」とかいう見慣れないエラーが表示されたので解決方法を紹介します。

まえがき

phpで外部のページに飛ばしたい時とかに重宝する「header(“Location:○○”)」ですが、この前この関数を使用した時に「Warning: Cannot modify header information – headers already sent by ・・・」という見たことのないエラーが表示されました。

「header(“Location:○○”)」でエラーなんて出たことなかったので焦りましたが解決したので覚え書きです。

Warning: Cannot modify header information・・・」エラーの原因

Warning: Cannot modify header information・・・」エラーは考えられる原因が2つあります。

原因1「header()」関数の前に出力や改行

KoToRiはまさにこれが原因でした。

「header()」関数を使用する際は全ての画面上への出力の前に実行する必要があります。

言葉だと分かりにくいので例を挙げていきましょう。
まずKoToRiの原因を例に挙げてみます。

 //←改行が入っちゃってる
<?php
header('Location: http://www.example.com/');
?>

「header()」関数実行前に改行やスペースが入ってしまうと「Warning: Cannot modify header information・・・」エラーが出てしまいます。

また「header()」関数実行前に「echo()」とかで画面に何かしら出力する処理をしてもダメです。例えばこのコードだと「Warning: Cannot modify header information・・・」エラーがでます。

<?php
echo 'これだとエラーが出るよ';
header('Location: http://www.example.com/');
?>

「echo()」の例だと順番を変えればエラーは出ません。

<?php
header('Location: http://www.example.com/');
echo 'これだとエラーは出ないよ';
?>

こういう系はうっかりミスでやりがちなので気を付けましょう。

原因2 「php.ini」の「output_buffering」の設定

原因1を修正しても解決しなかった場合、「php.ini」の「output_buffering」の設定を変更すると解決するかもしれません。

output_buffering = Off

output_buffering = On

に設定を変更してみましょう。

この「output_buffering」という設定項目は「header()」「setcookie()」以外の実際に出力される部分(httpレスポンスボディ)をバッファリングするかどうかです。
つまり「output_buffering = On」を設定すれば実際に出力される部分(httpレスポンスボディ)がバッファリングされます。

となると「output_buffering = On」を設定すれば
「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ません

例えばログイン機能でcookieを使用する際などの「header()」や「setcookie()」の実行前に出力的な処理を行いたい場合は非常に重宝するでしょう。

PHPマニュアルの出力制御の説明ページのリンク貼っときます。
出力制御

まとめ

最初はただの素人ミス「不要な改行が入っていた」のが原因だったというところから、この記事を書くために色々調べていくと最終的に「output_buffering」の機能にまで発展し「output_buffering = On」を設定すれば「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ないというところまで辿り着きました!
ブログを書くということは奥深いですね。特にこういう技術系ブログに関しては自分の知識的にもいい効果が生まれていると実感できます。

という本題と関係のない話は置いといて今日はこれだけ覚えて帰ってください。

「output_buffering = On」を設定すれば「header()」関数の実行前に「echo()」や改行が入っていてもエラーが出ません

シェアするみんなシェアしてね

フォローするフォローする

いつもKOTORI Blogをご覧いただきありがとうございます。Facebook、Twitterを通じて、皆様と交流していき色んな情報を共有していければな~と思ってます。お気軽に登録してください!

基本フォロー返します。

RSSを登録する

RSSはこちらから。

follow us in feedly

Feedly使ってる人はこちらから。

Buy me a Beer

動く!パンDのLINEスタンプ
好きな人にアプローチスタンプ
パンDのLINEスタンプ

関連する記事関連する記事も読んでみてね

コメント