現在Webサービスを一つ作っているのだが、HTMLの当て込みと各ファイルをincludeしている最中にトラブルが発生した。
DBと通信して文字列を保存や削除機能を作っているのだが、上記の当て込みを行った途端、下記のようなエラーが発生した。
Warning: Cannot modify header information - headers already sent by (output started at パス\side.php:28) in パス\delete.php on line 14
自分はまだPHPに毛が生えた程度の実力なので、解決までめちゃくちゃ時間がかかってしまったので、今後のためにもメモとして記録しておく
Table of Contents
原因:header関数のlocationの前に出力があった
先ほどのエラーは、ヘッダー情報を変更しようとした時に既にページの出力が始まっている場合に発生する。
単純な話、header関数でlocationを使う場合、その処理よりも前にechoやhtmlなどで何かしらの出力をしていると、エラーが発生する仕組みになっている。
自分は冒頭でも話した通り、各ファイルをインクルードし、下記のような構成を作ってしまったのだ。
<?php include __DIR__ . '~phpファイル~'; ?>
<?php include __DIR__ . '~phpファイル~''; ?>
<?php include __DIR__ . '/include/side.php'; ?>
<main class="profile_form">
保存結果の出力(削除ボタン等あり)~~~
<?php require_once __DIR__ . '/delete.php';//この中でdelet.phpをインクルードしている?>
</main>
<?php include __DIR__ . '~phpファイル~''; ?>
上記の場合、削除処理を行う delete.php よりも前に side.php がインクルードで呼び出されているのが分かるだろう。
このside.phpではechoやHTMLなどの出力が行われているため、delete.phpのheader関数はこれよりも後に処理されるためエラーが発生してしまうのだとか。
解決方法:heder関数の部分だけJavaScriptで処理する
chatGPTに聞いても解決できなかったため、さんざん悩んだが、解決方法はかなりシンプルだ。
header部分の関数をJSで下記、それをechoの中に記述すればオッケーだ。
<?php
echo '<script>window.location.replace("profile.php?delete_message=' . urlencode($delete_message) . '");</script>';//代わりにJSで飛ばす
?>
こうすればパラメーターを持たせた状態でJSの処理によって削除を行ったページへリダイレクトすることが可能となる。
つまりPHPとPHPの処理がバッティングしているので、それをPHPとJSでやれば問題ないということだ。
今はわからないことはGoogle検索よりもChatGPTに質問攻めしていたが、ネットのソースの方が答えが素早く見つかる可能でいもあると改めて実感したエラーだった。