dポイントプレゼントキャンペーン実施中!

PHP スクリプトを修正していて、コメント行を1行入れただけで、
Warning: Cannot modify header information - headers already sent by (output started at mylist.php:96) in mylist.php on line 125
というエラーが出るようになり、困っています。
既出の問題だとは思いますが、ヒントでも頂ければと思い投稿しました。

直接の関係は無いと思いますが、コメント行は、先頭に以下のように入れています。
<!--
##################################################
ID : mylist.php
Update : (中略)
Update : 2016/07/05 ***********
Upda → これ以上の文字を入れると、Warningになる。
##################################################
-->

既出の質問やネット上の記事で調べてみると、HTTP ヘッダーを変更する関数の呼び出しより前に、すでに何かがアウトプットされているために発生するという情報があるのですが、該当する部分がどうしても見当たりません。
ちなみに、
(output started at mylist.php:96) にある96行目には、
94: </head>
95: <body oncontextmenu='return false'>
96: <?php

in mylist.php on line 125 にある125行目には、
124:// 呼び出し元をCookieに保存
125:setcookie('THISFORM',basename(__FILE__),0,'/');
126:(改行)

<body>タグから、125行目までsetcookieまで、printとかechoとかの命令はありません。
余分な空白行を削ってみましたが、結果は同じでした。

php5.4 Windows2008R2上で動作しています。
また、あまりよろしくないと思いつつ、ソースコードはsjisで書いています。

<?php ob_start(); ?> を先頭に入れて、取りあえずは解決したのですが、原因がはっきりしないので気色悪いです。

質問者からの補足コメント

  • うれしい

    コメントを <?php /* */ ?> という書き方にしたら出なくなりました。
    いままで間違った書き方をしていたんですね。
    どうも有難うございました。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/07/07 15:46

A 回答 (4件)

HTML のコメント形式なので、コメント部も HTML の一部として出力されるためです。



PHP のコメント形式にしましょう
https://secure.php.net/manual/ja/language.basic- …
この回答への補足あり
    • good
    • 0
この回答へのお礼

コメント有難うございました。

冒頭のコメント部分はhtml部分なので、htmlのコメントの書き方をしているのですが、これも、<?php ..... ?>で括って書くのが正しい書き方なんでしょうか?
ちなみに、phpで括った部分は 全て 1行単位で // を冒頭に書くようにしています。

お礼日時:2016/07/07 15:33

まぁコメントなんで<html>タグより後に書いたほうが良いですね。


ソースの視認性のために、先頭に近い部分に載せておきたいなら

<?PHP
ob_start();
?>
// コメント文
<?PHP
・・・
途中でhttp header出力OK
・・・
$comment=ob_get_contents();
ob_end_clean();
?>
<html>
<?php
print $comment;
?>

のようなことをしないと、コメントをhtmlに出力することができません。

htmlで出力する必要がなければ(申し伝え文書っぽいのでこちらのケースだと思いますが)
#3さんの言うようにphpのコメントとして書けばいいでしょう
<?PHP
/*
コメント
*/
?>
    • good
    • 0
この回答へのお礼

有難うございました。
コメントが問題になるとは思いませんでした。
全く意識してませんでしたが、今後はこうした書き方に直していこうと思います。

お礼日時:2016/07/08 09:14

あ、でもバッファリングで回避できているなら違うかもしれない・・・



先頭あたりでob_start()を発行して、エラーのでる行の直前で
$debug=ob_get_contents();
ob_end_clean();
としてその後、var_dump($debug);で内容を確認してみるとよいです。
    • good
    • 0
この回答へのお礼

コメント有難うございます。

ob_start(); だけだとワーニングは出ないのですが、
エラー発生行に
$debug=ob_get_contents();
ob_end_clean();
var_dump($debug);
を追加すると、
string(4111) " "
と出て、その後に同じワーニングが出るようになります。

お礼日時:2016/07/07 15:41

UTF8のBOMじゃない?


対応としてはUTF8Nなどで保存する。
    • good
    • 0
この回答へのお礼

コメント有難うございます。

本当はそうしたいのですが、ソースはutf8でなく、sjisで書いているので、これではないと思います。

お礼日時:2016/07/07 15:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!