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";
No.3ベストアンサー
- 回答日時:
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を指定してやる必要があります。
(上記の説明でご理解いただけましたでしょうか…。)
お返事ありがとうございます。
ご丁寧にご説明頂き本当に感謝です!
>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関数で指定すれば環境によっての
文字化けを防ぎ読み込む全てのファイルに指定する必要はない。
・・・という理解で間違いなかったでしょうか?
No.4
- 回答日時:
> 使用しているサーバーはmbstring.http_outputがPASSとなってる事もあり、
> 実際に表示されるファイルの先頭にheader関数で指定すれば環境によっての
> 文字化けを防ぎ読み込む全てのファイルに指定する必要はない。
おそらくそれで大丈夫だと思います。
(やっぱりあまり自信がありませんが。。)
やってみてダメだったらまた質問してみてください。
お返事ありがとうございます。
後半は、質問の趣旨から方向が変わってしまいましたがご丁寧に教えて頂き
大変勉強になりました!
ひとまず質問の趣旨については既に解決しておりますのでここで解決と
させて頂きます。
本当にありがとうございました。
No.2
- 回答日時:
ブラウザは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の変更などもできないようです。
度々のお返事ありがとうございます。
>mbstring.http_output が設定されていなければ、出力する文字コードがUTF-8なのに
>Webサーバー(CGI?)が勝手にContent-Type=Shift_JISを送ってブラウザが誤判定するかもしれないので、
>指定してやる必要があります。
以前にutf-8で作ったにも関わらず環境により文字化けして表示される事が
あったのでそれ以後はheader関数を使っておりました。
未だに原因がわかりませんがこれが原因だったのかなと思いました。
後でサーバーの詳細を調べてみようと思います。
phpでサイトを作る際に実際にアクセスされるファイルにrequireなどで外部ファイルを読み込みするので
全ての外部ファイルに記述しようと思ったのですが3つ以上読み込もうとすると
Cannot modify header informationというエラーが表示されてしまい原因を調べたところ
既に送られているために起こるエラーという事がわかりました。
全てのファイルに記述することは不可能な感じなので実際にアクセスするファイルのみに
記述しておりますが正直不安なところです・・・^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHPプログラムの間違い 1 2022/10/06 14:33
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP php ログイン 1 2022/11/01 00:24
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP php テーブルが作成できない 1 2022/11/17 23:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csvファイル出力時に文字化けし...
-
XMLのロードに失敗する
-
PHPのif文でその処理を途中で抜...
-
【file_exists】ファイルが存在...
-
onedrive にexcelファイルをア...
-
拡張子php画像をjpg画像等に変...
-
youtubeに音声のみのmp4ファイ...
-
PHPのMySQLモジュールのインス...
-
pixivのイラスト投稿の仕方を教...
-
javascriptからphpへ変数
-
PHPで作るフレーム、どんな風に...
-
PHPで外部プログラムのバックグ...
-
FTPでのファイルとディレクトリ...
-
ファイルアップロードの上限を...
-
フレームワークの選定について
-
ヒアドキュメントの中で別ファ...
-
PHP8を使うと、大量のWarningが...
-
さくらサーバーにて、phpからメ...
-
PHP MySQLに画像を直接保存
-
localhostでphpのページが表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EclEmmaレポートのエクスポート...
-
PHPで韓国語の表示がうまくいき...
-
PHPExcelバッファへの書き込み...
-
文字コード変えたら、fopenでき...
-
HTTPヘッダはメタタグにも記述...
-
Eclipseで文字化け
-
csvファイル出力時に文字化けし...
-
phpで動的タイトル
-
文字集合範囲外の文字とパーセ...
-
phpログファイルの文字化けにつ...
-
PHPで「®」や特殊文字のエスケープ
-
phpフォームで文字化け
-
Google Chromeで文字化け
-
発生した文字化けに対する対処
-
サーバーにアップすると文字化...
-
GEEKLOG(ギークログ) 文字化け
-
PHP time()に関しての質問です
-
文字化けについて
-
UTF8のページでIEがシフトJISを...
-
batファイルでうまく動かないプ...
おすすめ情報