ここから本文です

header("Content-Type: text/html; charset=UTF-8");でWarningになる理由と対処方...

obaketsu3さん

2007/10/1316:12:08

header("Content-Type: text/html; charset=UTF-8");でWarningになる理由と対処方法を知りたいです。

PHPを勉強し始めたのですが、どんなフリーのスクリプトを使っても必ず 「Warning: Cannot modify header information - headers already sent by (output started at /home/***/www/) 」とエラーが出ます。原因は「header("Content-Type: text/html; charset=UTF-8");」のようで、いつもコメントアウトするか「@」などを頭に入れてエラーを消してます。

サーバーはさくらのレンタルサーバースタンダードプランです(PHP Version 4.4.6)。

Warninguの原因と対処方法を教えていただけると幸いです。

補足言葉足らずなので補足します。コメントアウトや@を付ける対処ではなく根本的な原因が知りたいです。か、headerエラーは普通で起こって当たり前なのでしょうか?PHPを触り始めたばかりで「Warning = 駄目」みたいに感じてます。エラーが出ないようにphp.iniを設定すると言うのを目にしたのですが、ただ隠してるだけでエラーがある事自体が不安です。

それにしても「知恵袋」って返信出来ないのですね・・・。

閲覧数:
28,065
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

編集あり2007/10/1412:59:45

header()には一つの制約があります。
Cookieと同じく、文字列などを出力する前に送信せねばなりません。(これはHTTP規格の制約です。)

以下にサーバーがクライアントに送るデータの一例をしめします。

# http://www.kanzaki.com/docs/sw/http-header.html より抜粋・改め
HTTP/1.1 200 OK
Date: Wed, 05 Sep 2001 06:06:19 GMT
Server: Apache/1.3.12
Content-Location: http-header.html.ja
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref="/w3c/p3p.xml",CP="NOI DSP COR ADM DEV OUR STP"
Last-Modified: Wed, 05 Sep 2001 06:02:09 GMT
Connection: close
Content-Type: text/html; charset=shift_jis
Content-Language: ja

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" dir="ltr"><中略></html>
# 接続解除

DOCTYPE(文書型宣言)以前の部分が、ヘッダーです。
ヘッダーは普段目にする出力の前に存在するのですね。
よって、最も先頭においておく必要があります。

エラーメッセージをみて下さい。常に最初に出力を送信(already sent by 略)とあります。
これは、echo などで出力、ないしheader()の前にHTML文書がある場合、DOCTYPE以降の出力をするために、サーバーはヘッダーを送信してし終えたことを意味します。

このPHPコードはよって無効です。

# 例
<!DOCTYPE 略>
<html>
<?
header("Content-Type: text/html; charset=UTF-8");
?>


以下のようにすれば有効です。

# 例
<?
header("Content-Type: text/html; charset=UTF-8");
?>
<!DOCTYPE 略>
<html>(以下省略





エラーの意味がわからない時は、まずエラー文を邦訳してみてください。
次に、エラー文で示された行に関わる関数などのマニュアルを読んだり、コードが正しいか確認して下さい。


PHPはエラーに対し比較的寛容です。
Fatal(致命的)でない限り、@(制御)すれば続行できます。
変数宣言(var)なしでもエラーが発生しないように設定されてますが、これはJavaScriptなどでは実行がそこで止まるエラーです。
実行速度を上げるためにも、基本に忠実につくって下さい。
@は基本的に、エラーが発生した場合にカスタマイズされたエラーを出力するため、または例外処理をするために使用してください。(エラーを隠すため、たとえばfopenなどに一応つけるなど。)

質問した人からのコメント

2007/10/14 15:32:33

非常に分かりやすかったです。英語が苦手なため毎回翻訳しながらだったのですが・・・。

>PHPはエラーに対し比較的寛容です。

と言う部分でかなり安心致しました。本当に感謝します!基本に忠実に作れるようこれからも頑張っていきます!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

2007/10/1400:53:53

エラーメッセージを読む限りすでにヘッダーは送ってしまったので改変できませんということですから
header(...);以前のrequireやincludeで何らかの形でヘッダーが送信されているのではないでしょうか?

この状態だとリダイレクトとかできないっとか問題があるかも知れません。

bc234567890さん

2007/10/1320:11:16

> 原因は「header("Content-Type: text/html; charset=UTF-8");」のようで、いつもコメントアウトするか「@」などを頭に入れてエラーを消してます。

だから、それでいいんじゃないの???

何がまずいわけ?

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。