PHPで、下記のスクリプトに対して、エラーが出ます。


-----------------------------------------------------
<?php
$cnt=$_COOKIE['cnt']+1;
setcookie ('cnt',$cnt,time()+60*60*24*90);
print("あなたがこのサイトを訪れたのは $cnt 回目です。");
?>
-----------------------------------------------------

エラー内容
-----------------------------------------------------
Warning: Cannot modify header information - headers already sent by (output started at C:\Apache2\htdocs\dokushu\check2-8.php:1) in C:\Apache2\htdocs\dokushu\check2-8.php on line 3
あなたがこのサイトを訪れたのは 5 回目です。
-----------------------------------------------------

独習PHPに記述されているスクリプトを丸写しして、何度も見直してたので記述間違いは無いと思うのですが・・・。

何が問題なのでしょうか?

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/08/02 16:02:46
  • 終了:2010/08/02 17:31:25

ベストアンサー

id:pacochi No.2

ぱこち回答回数246ベストアンサー獲得回数1112010/08/02 17:03:45

ポイント40pt

setcookie は header と同様に、本文の出力より先に実行しなければならないのですが、BOM のせいで既に本文が出力された状態になってしまっているようです。


PHP のスクリプトを UTF-8 で書く場合は、「UTF-8(BOMなし) エンコード」の方で保存して下さい。


文字化けする場合は、

setcookie ('cnt',$cnt,time()+60*60*24*90);

の下に、

header ("Content-Type: text/html; charset=UTF-8");

という一行を追加してみて下さい。

id:kazoo9

「UTF-8(BOMなし) エンコード」及びご教授頂いたスクリプトを加えたところ、正常に稼動しました。

有難うございました。

2010/08/02 17:30:16

その他の回答(2件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/08/02 16:21:50

ポイント40pt

まず、その3行だけで動かせば正常に動きますので、3行だけにしてテストしてみてください

 

原因のほうですが、エラーメッセージによると、その3行にの後でheader(ほげほげ);を実行しようとしているようですね

header はWEBサーバがブラウザに対して一番最初に出力しなければいけないものなので、いかなる出力(printやechoなど)よりも後に出力しようとするとエラーになります。

独習PHP は読んだことありませんが、正誤表( http://www.seshop.com/book/errata/6574/list )にも記述はありませんし、そもそも、エラーとなるようなサンプルが載っているとは思えませんので、失礼ながら自分で勝手に改造なさったのではありませんか?

独自でコードを改造したのであれば、そのコードを本の通りに直すか、あるいは、返信欄にあなたが自分で改造したコードと、何をやりたかったのかを記述してみてください

id:kazoo9

ご回答を有難うございます。

1行目「」の前にも後にも一切の記述はしておらず、「」の行をあわせて5行だけで実行しています。

また、「独習PHP」の穴埋めの練習問題に対し、解答で記述されている内容をそのまま入力して実行しましたので、特に改造はしていません。


補足ですが、フォーマットは、「UTF-8 エンコード」で実行しています。

「UTF-8(BOMなし) エンコード」で実行すると、文字化けして下記の表示になります。

--------------------------------------------------------------

縺ゅ↑縺溘′縺薙�繧オ繧、繝医r險ェ繧後◆縺ョ縺ッ縲5 蝗樒岼縺ァ縺吶

--------------------------------------------------------------

2010/08/02 16:50:53
id:pacochi No.2

ぱこち回答回数246ベストアンサー獲得回数1112010/08/02 17:03:45ここでベストアンサー

ポイント40pt

setcookie は header と同様に、本文の出力より先に実行しなければならないのですが、BOM のせいで既に本文が出力された状態になってしまっているようです。


PHP のスクリプトを UTF-8 で書く場合は、「UTF-8(BOMなし) エンコード」の方で保存して下さい。


文字化けする場合は、

setcookie ('cnt',$cnt,time()+60*60*24*90);

の下に、

header ("Content-Type: text/html; charset=UTF-8");

という一行を追加してみて下さい。

id:kazoo9

「UTF-8(BOMなし) エンコード」及びご教授頂いたスクリプトを加えたところ、正常に稼動しました。

有難うございました。

2010/08/02 17:30:16
id:tasklight No.3

tasklight回答回数323ベストアンサー獲得回数402010/08/02 17:18:09

ポイント40pt

PHPのサーバ環境がわからないので確実な回答はできませんが、おそらくUTF-8(BOM付き)で記述しているのが問題です。PHPはUTF-8(BOM付き)のスクリプトを正常に処理できないので、UTF-8(BOM無し)にしてみてください。


文字化けの問題は、ブラウザの文字コードを手動でUTF-8(BOM無し)にするか、以下のようにheader関数でContent-Typeを指定して下さい。

<?php
header('Content-Type: text/html; charset=utf-8');
$cnt = $_COOKIE['cnt'] + 1;
setcookie ('cnt', $cnt, time() + 60 * 60 * 24 * 90);
print("あなたがこのサイトを訪れたのは $cnt 回目です。");
?>
id:kazoo9

「UTF-8(BOMなし) エンコード」及びご教授頂いたスクリプトを加えたところ、正常に稼動しました。

有難うございました。

2010/08/02 17:30:17
  • id:windofjuly
    うぃんど 2010/08/02 17:16:25
    >あわせて5行だけ
    こちらでも同じ状態でテストしての回答でした。ただしLinuxサーバで確認(偶然ですが文字円コードは同じくUTF-8でBOM無し)したものだったので、それが間違いだったようで、ごめんなさい
    ヘッダが正しい順序で出力されていないのは、下記の方と同じ原因だと思いますのでphp.iniを確認してみてください
    http://go4it.seesaa.net/article/73726670.html
    >>
    php.iniにて
      output_buffering = Off
    となっている箇所を、
      output_buffering = On
    にする。
    <<
     
    >文字化けして下記の表示
    正誤表によりますと出力にはSJISが指定されているようなのでUTF8で出力したものの、ブラウザ側はSJISとして対応してしまうため文字化けします
    出力もUTF-8として指定してあれば あなたがこのサイトを訪れたのは 1 回目です。 となるはずです
     
    その本のサンプル( http://www.wings.msn.to/index.php/-/A-07/4-7981-0981-9/
    )をダウンロードしてみたところEUC-JPだったので整合性が取れていないのですが、文字コードの設定関連を整理しなおす必要があるかもしれないです
  • id:kazoo9
    windofjuly 様

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

    http://go4it.seesaa.net/article/73726670.html の設定は実は対処していたのですが、それでもダメでした。

    他にご回答頂いた方から、header関数を加える方法をご指導いただいたので、修正して実行したところ、うまく作動しました。

    実際のお仕事で、ウェブ環境に公開するシステムを作る場合は、ユーザーにブラウザ環境を調整していただくわけにも行かないでしょうから、このあたり良く勉強する必要があるのですね。

    サンプルまでダウンロードして調べて頂いたりして、有難うございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません