HTMLでPHPを読み込む方法

HTMLでPHPを読み込む方法

PHPのページにPHPを読み込む(include)のは非常に簡単だが、HTMLのページにPHPを読み込んで使用するのはちょっと手間がかかる。

場合によっては、色々悩むよりhtml→phpファイルに作り変えるほうが早いし簡単だけど、ページが多くて修正がしづらい構成(phpと違ってhtmlで作ったページは外部ファイルでheaderやfooter別に管理できないので・・・)なら、やはりhtmlでphpを読み込みたいところだ。

せっかくなので両方(PHP→PHPとPHP→HTML)をまとめてみた。

PHPで外部ファイルをインクルードする

インクルードするファンクションは2つ、require()とinclude()があり、前者はファイルの読み込みに失敗した場合に処理が停止するが、後者は失敗してもその後のプログラムが実行される。

<?php
require "file.php"; //括弧なし
 
require('somefile.txt'); //括弧付き
 
//もちろんファイルへのパスを変数化することもできます
require $somefile;
?> 

それ故、include()ではファイルの読み込みが正常に行われたかを調べることができるし、サイトの表示にも影響を与えない。

実際にPHPファイルで外部ファイルとしてbbbb.phpを読み込んでみると、以下のようになる。

<?php
$val = include("kaunta/bbbb.php");
if($val){
  echo $val;
} else{
  echo "読み込み失敗!!";
};
?>

以下がbbbb.phpのファイル内の記述で、これをincludeする。(Wordpressの投稿画面だとhtmlしか使えないのでサンプルはなし)

<?php
// カウンター用ファイル場所
$counter = "kaunta/data.txt";
// ファイルオープン開始(fopenはファイルを開く関数)
$fp = fopen("$counter", "r+") or die("error: ファイルを開けませんでした。");
// 一行読み込んで変数に入れる(2番目の引数はバイトで日本語1文字2バイト)
$count = fgets($fp, 1024);
// 変数に+1する
$count++;
// ファイルをロックする(書き込んでいる間は読み込めないようにする。EXは読み手排除)
flock($fp, LOCK_EX);
// ファイルの0行目に移動
fseek($fp,0);
// 新しいカウンター値を書き込み
fputs($fp, $count);
// ファイルロック解除(UNがロックを開放)
flock($fp, LOCK_UN);
// ファイルクローズ(fopenの逆)
fclose($fp);
// 6桁の数字で成型後、出力
echo sprintf('%06d', $count) . '人目';
// $aが123ならsbstrは123の0番目から1つ(1)、次1番目から1つ(2)とforで取り出す。
$a = sprintf("%06d", $count);
for ($i=0;$i<strlen($a);$i++) {
   echo "<img src='kaunta/img/" . substr($a, $i, 1) . ".gif' />";
}
// 何も書かないと1という文字が出るのでやむなく記述・・・
return " ";
?>

HTMLファイルにPHPを読み込む

さて、問題はここだ。色々と調べると、.htaccessファイルをウンタラカンタラしてhtmlをphpと認識させるとかいうのもあったが、これが上手く機能しなかったため、javascriptを使って読み込むという方法を試みた。

概要としては、htmlからjsファイルを読み込むようにphpファイルを読み込んで実行させるというもので、body内の好きな場所に記述する。

<script type="text/javascript" 
src="http://nkdesk.com/kaunta/dddd.php"></script>

そしたら読み込むファイル(例ではdddd.php)の2行目にheaderファンクションを記述する(サーバーが自動で対応している可能性が薄いらしく、ほぼ必須の記載事項です)。これでphpファイルをjavascriptとして出力できる。(headerは必ず先に記述)

javascriptとして出力するためには、最終的にjavascriptの命令でhtmlに受け渡さなければいけないので、document.write命令ごとecho出力します。document以下はダブルクオーテーションでくくり、()の中身はシングルクォーテーションか、ダブルクオーテーションでくくるならバックスラッシュ(¥)でメタ文字を無効化させておく。

変数との連結をドットでやってるサイトがありましたが、特に結合しなくてもうまくいきました。

<?php
header("Content-type: application/x-javascript");

// カウンター用ファイル場所
$counter = "kaunta/data.txt";
// ファイルオープン開始(fopenはファイルを開く関数)
$fp = fopen("$counter", "r+") or die("error: ファイルを開けませんでした。");
// 一行読み込んで変数に入れる(2番目の引数はバイトで日本語1文字2バイト)
$count = fgets($fp, 1024);
// 変数に+1する
$count++;
// ファイルをロックする(書き込んでいる間は読み込めないようにする。EXは読み手排除)
flock($fp, LOCK_EX);
// ファイルの0行目に移動
fseek($fp,0);
// 新しいカウンター値を書き込み
fputs($fp, $count);
// ファイルロック解除(UNがロックを開放)
flock($fp, LOCK_UN);
// ファイルクローズ(fopenの逆)
fclose($fp);

$c = sprintf('%06d', $count) . '人目';
echo "document.write(\"$c\")";
?>

続いて画像の出力。phpファイルの読み込みは上記と同じでscriptでくくる。phpファイルは以下。

<?php
header("Content-type: application/x-javascript");

// 略

$a = sprintf("%06d", $count);
$f = array();
for ($i=0;$i<strlen($a);$i++) {
$d = "<img src='http://nkdesk.com/kaunta/img/" . substr($a, $i, 1) . ".gif'>";
$f[] = $d;
}
 
for ($e=0;$e<strlen($a);$e++) {
$g .= $f[$e];

echo "document.write(\"$g\")";
?>

なんだか、面倒な事をやっているようだが、うまく表示出来なかったためやむを得なかった。

document.write命令を連続して記述したときに表示がうまくされなかったため(普通は表示されるっぽい)、document.write命令は1つにして、その中にimgタグを羅列する形で記述することにした。

そのため、わざわざ、配列を作って0から5までimgに関連付けて順番に格納した後に、それらを順番に取り出して.=でつなげたわけです。$a.=$bは$a=$a.$bと同じ事です。

また、クォーテーションマークについても意外とクセモノでして、¥を使うときとかのタイミングが未だに掴めず・・・。今は保留。

参考(引用)サイト:http://nyx.pu1.net/reference/loadfile/require.html、http://php.thm.jp/index.php?content=counter

2012年3月5日1:07 AM | カテゴリー: PHP | コメント(1)

コメント

  • index.htmのファイル名のままPHPの結果を表示する方法を探していました。.htaccessではレンタルしたサーバーが対応せず、こちらの方法で解決することが出来ました。htmとphpのファイル単位で解説してくれるサイトが少なくてとても参考になりました。

    2015年12月19日12:18 PM| 12月の入門者

コメントを残す

メールアドレスが公開されることはありません。