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

phpで動的タイトルを作りたいのですが$page_titleが
表示できません。
body.phpに<html>~<body>を書きindex.phpに読み込み表示させ
index.phpに$page_titleがあればタイトルに表示させるように
したく下記のようにしてみましたが表示されませんでした。
試しにindex.phpの$page_titleを消すとタイトルの文字のみが
出力されるので値があるかについては大丈夫かと思うのですが
どのようにすれば表示されるのでしょうか?

---body.php---
if($page_titel) {
echo "<title>タイトル - ".$page_title."</title>\n";
} else {
echo "<title>タイトル</title>\n";
}

---index.php---
$page_titel = "ページタイトル";
require_once "body.php";

A 回答 (4件)

requireなどのinclude系の関数について勘違いしていらっしゃるようですね。


includeは記述したその場所に指定したファイルを読み込むだけです。
include(ファイル名)と記述した1行を、そのファイルの内容で置き換える、
と考えていただくとわかりやすいかと思います。
そのため、PHPがWebサーバーに渡すContent-Typeは一つだけです。
つまり、header関数でContent-Typeを2回以上指定するのはおかしいということになります。
(だからエラーが出るのですが。)

Content-Typeに関しては、CGIのRFC3785で、CGIから渡されたContent-TypeをWebサーバーは
クライアント(ブラウザ)にそのまま渡すべき、と規定されていますので、
PHPがContent-Typeを渡せばWebサーバーはブラウザにそれを渡し、
PHPがContent-Typeを渡さなければWebサーバーはブラウザに何も渡しません。
WebサーバーはContent-Typeが渡されればその値を使いますが、
渡されなければ勝手に判別します。

調べてみたところ、PHPではContent-Typeのcharsetの値に、
header関数でConetnt-Typeのcharsetが指定されていればその値、
mbstring.http_outputに値が指定されていれば(PASSとなっていなければ)その値、
どちらも指定されていなければdefault-charsetの値を入れます。
default-charsetすら指定されていなければcharsetは渡しません。
環境依存の文字化けの原因は、PHPがcharsetを渡さないことにより、
Webサーバーもブラウザにcharsetを渡さないので、文字コードの判別がブラウザ任せになるためです。

概念のご説明が長くなってしまいましたが、php.iniを編集できない状況で確実に文字化けを防ぐためには、
header関数でcharset=utf-8を指定してやる必要があります。
(上記の説明でご理解いただけましたでしょうか…。)
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
ご丁寧にご説明頂き本当に感謝です!

>includeは記述したその場所に指定したファイルを読み込むだけです。

これについては理解しているつもりなのですが環境により文字化けを
してしまうこともあり全てのファイルをutf-8で保存しながらも読み込む
全てのファイルに必要なのかなと思っておりました。

>include(ファイル名)と記述した1行を、そのファイルの内容で置き換える

ということはinclude()としている箇所に読み込むソースが記述している
という事と同じとなるので全てのファイルにheader関数で指定しても
実際に表示されるされるファイルにheader関数を複数記述していると
同じ事となりエラーが起こる訳ですね。

例えば
---inc.php---
<?php

header('Content-Type: text/html; charset=utf-8');

echo "あいうえお";

?>
---index.php---
<?php

header('Content-Type: text/html; charset=utf-8');

include(inc.php);

echo "かきくけこ";

?>

とした場合ブラウザではindex.phpは

header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/html; charset=utf-8');
あいうえおかきくけこ

となりエラーが起こるということですね。

>php.iniを編集できない状況で確実に文字化けを防ぐためには、
header関数でcharset=utf-8を指定してやる必要があります。

使用しているサーバーはmbstring.http_outputがPASSとなってる事もあり、
実際に表示されるファイルの先頭にheader関数で指定すれば環境によっての
文字化けを防ぎ読み込む全てのファイルに指定する必要はない。

・・・という理解で間違いなかったでしょうか?

お礼日時:2008/06/19 12:13

> 使用しているサーバーはmbstring.http_outputがPASSとなってる事もあり、


> 実際に表示されるファイルの先頭にheader関数で指定すれば環境によっての
> 文字化けを防ぎ読み込む全てのファイルに指定する必要はない。

おそらくそれで大丈夫だと思います。
(やっぱりあまり自信がありませんが。。)
やってみてダメだったらまた質問してみてください。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
後半は、質問の趣旨から方向が変わってしまいましたがご丁寧に教えて頂き
大変勉強になりました!
ひとまず質問の趣旨については既に解決しておりますのでここで解決と
させて頂きます。

本当にありがとうございました。

お礼日時:2008/06/19 16:55

ブラウザはContent-Typeが指定されていなければ勝手にHTMLだと判断してくれますし、


PHPの場合、php.iniか.htaccessで mbstring.http_output が設定されていればその文字コードが優先されるので、
header('Content-Type: text/html; charset=utf-8');
は必要ありません。

mbstring.http_output が設定されていなければ、出力する文字コードがUTF-8なのに
Webサーバー(CGI?)が勝手にContent-Type=Shift_JISを送ってブラウザが誤判定するかもしれないので、
指定してやる必要があります。

PHPのheader関数は、HTMLファイル以外を出力する場合によく使います。
header( "Content-Type: image/jpeg" );
など。

と書いてみたものの、あまり自信がないので間違っていればどなたか補足をよろしくお願いしますm(__)m

この回答への補足

早速サーバーを確認してみたのですがmbstring.http_outputは
Local ValueもMaster ValueもPASSとなっておりました。
PASSとは一体?・・・

レンタルサーバーなのでphp.iniの変更などもできないようです。

補足日時:2008/06/18 02:26
    • good
    • 0
この回答へのお礼

度々のお返事ありがとうございます。

>mbstring.http_output が設定されていなければ、出力する文字コードがUTF-8なのに
>Webサーバー(CGI?)が勝手にContent-Type=Shift_JISを送ってブラウザが誤判定するかもしれないので、
>指定してやる必要があります。

以前にutf-8で作ったにも関わらず環境により文字化けして表示される事が
あったのでそれ以後はheader関数を使っておりました。

未だに原因がわかりませんがこれが原因だったのかなと思いました。
後でサーバーの詳細を調べてみようと思います。

phpでサイトを作る際に実際にアクセスされるファイルにrequireなどで外部ファイルを読み込みするので
全ての外部ファイルに記述しようと思ったのですが3つ以上読み込もうとすると
Cannot modify header informationというエラーが表示されてしまい原因を調べたところ
既に送られているために起こるエラーという事がわかりました。

全てのファイルに記述することは不可能な感じなので実際にアクセスするファイルのみに
記述しておりますが正直不安なところです・・・^^;

お礼日時:2008/06/18 02:15

変数の綴りが間違ってるからでは?」

    • good
    • 0
この回答へのお礼

う~ん・・・お恥ずかしい限りです。w
修正したところ問題ありませんでした・・・

ひとつ質問があるのですが外部ファイルを読み込む際に
外部ファイルの先頭にそれぞれ
header('Content-Type: text/html; charset=utf-8');
とやっているのですがこれは無意味なのでしょうか?
もちろん実際にアクセスさせるindex.phpにも記述しております。
この辺がいまいちわからず教えて頂けますと幸いです。

お礼日時:2008/06/18 00:08

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