- ベストアンサー
phpで動的タイトルを作成する方法
- phpを使用して動的なタイトルを作成する方法について説明します。
- body.phpとindex.phpを連携させ、$page_titleの有無によってタイトルを表示する仕組みを実装します。
- しかし、$page_titleが表示されない原因として、変数名が誤っている可能性があります。再度確認しましょう。
- みんなの回答 (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を指定してやる必要があります。 (上記の説明でご理解いただけましたでしょうか…。)
その他の回答 (3)
- oka5130
- ベストアンサー率66% (35/53)
> 使用しているサーバーはmbstring.http_outputがPASSとなってる事もあり、 > 実際に表示されるファイルの先頭にheader関数で指定すれば環境によっての > 文字化けを防ぎ読み込む全てのファイルに指定する必要はない。 おそらくそれで大丈夫だと思います。 (やっぱりあまり自信がありませんが。。) やってみてダメだったらまた質問してみてください。
お礼
お返事ありがとうございます。 後半は、質問の趣旨から方向が変わってしまいましたがご丁寧に教えて頂き 大変勉強になりました! ひとまず質問の趣旨については既に解決しておりますのでここで解決と させて頂きます。 本当にありがとうございました。
- oka5130
- ベストアンサー率66% (35/53)
ブラウザは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 が設定されていなければ、出力する文字コードがUTF-8なのに >Webサーバー(CGI?)が勝手にContent-Type=Shift_JISを送ってブラウザが誤判定するかもしれないので、 >指定してやる必要があります。 以前にutf-8で作ったにも関わらず環境により文字化けして表示される事が あったのでそれ以後はheader関数を使っておりました。 未だに原因がわかりませんがこれが原因だったのかなと思いました。 後でサーバーの詳細を調べてみようと思います。 phpでサイトを作る際に実際にアクセスされるファイルにrequireなどで外部ファイルを読み込みするので 全ての外部ファイルに記述しようと思ったのですが3つ以上読み込もうとすると Cannot modify header informationというエラーが表示されてしまい原因を調べたところ 既に送られているために起こるエラーという事がわかりました。 全てのファイルに記述することは不可能な感じなので実際にアクセスするファイルのみに 記述しておりますが正直不安なところです・・・^^;
補足
早速サーバーを確認してみたのですがmbstring.http_outputは Local ValueもMaster ValueもPASSとなっておりました。 PASSとは一体?・・・ レンタルサーバーなのでphp.iniの変更などもできないようです。
- oka5130
- ベストアンサー率66% (35/53)
変数の綴りが間違ってるからでは?」
お礼
う~ん・・・お恥ずかしい限りです。w 修正したところ問題ありませんでした・・・ ひとつ質問があるのですが外部ファイルを読み込む際に 外部ファイルの先頭にそれぞれ header('Content-Type: text/html; charset=utf-8'); とやっているのですがこれは無意味なのでしょうか? もちろん実際にアクセスさせるindex.phpにも記述しております。 この辺がいまいちわからず教えて頂けますと幸いです。
お礼
お返事ありがとうございます。 ご丁寧にご説明頂き本当に感謝です! >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関数で指定すれば環境によっての 文字化けを防ぎ読み込む全てのファイルに指定する必要はない。 ・・・という理解で間違いなかったでしょうか?