PHP超入門 (45)
■ハードディスク上のテキストファイルの中身をフォームに読み込む■
今までの話の流れをここで、一度確認すると、以下のようになります。
(1) ブラウザのフォーム上に、自分の好きな内容の文章(テキスト)を入力
する。
↓
(2) ハードディスク上に新しくその入力された文章(テキスト)ファイルを
PHPプログラムで自動的に作成し、保存する。
↓
(3) その、文章(テキスト)ファイルを丸ごとブラウザのフォーム上に読み
込んで、ブラウザ上で自分の好きな内容に変更する。
↓
(4) その変更した内容を、丸ごとPHPプログラムで自動的に上書き保存する。
上記の(1)〜(3)の途中までは、今までお話した通りになりますが、前回、(3)
の段階で
-------------------------------------------------------------------------------
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力:<input type="text" name="text01" value="<?php print($text01) ?>">
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
という具合にすると、ブラウザに表示される一行テキストに、PHPのエラーメッ
セージが表示されてしまう、ということが分かりました。
及び
そのエラーの内容は、「PHPプログラムで指定している、変数(今回の場合は
「$text01」)の中身が指定されていない」というものです。
上記の内容は、単純なHTML文ではなく、「HTML文とPHPプログラムは混在して
書くことができる」という、PHPプログラムの性質を利用して、既にPHPプログ
ラムの世界である、ということをご理解ください。
さて、そのエラーを回避するためには、「$text01」の中身を指定する必要があ
りますし、できれば、というか最終的な目的は、前回お話したように、すでに
サーバーのハードディスク上にある、「096-2.txt」、
(↓ ファイルの中身)
の中身を入れ込みたいところです。
そのためにはどうしたらいいでしょうか?
■とりあえず(テキスト)ファイルを開く■
先ずは、とりあえず、「096-2.txt」と言うファイル中身を開いて、PHPプログ
ラムで、イロイロと取り扱えるようにしなければなりません。
そのためには、今まで、何度となく、このメルマガで扱ってきた、fopen(File
Open)関数を用いることになります。
その基本形としては
$file = fopen("ハードディスク上にあるファイルの位置の指定","そのファイルをどのように扱うかの引数の指定");
となり、上の一行を書くことで、サーバーのハードディスク上にある、文章
(テキスト)ファイルの中身を、変数「$file」に格納することが出来ます。
で、今回の場合は、一連の流れから書くと、
$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");
という具合になります。
ここで、「C:\\inetpub\\wwwroot\\php\\096-2.txt」という部分は、今回扱う、
「096-2.txt」がある場所を示し、
「r」は、「096-2.txt」という文章(テキスト)ファイルの内容を読み込み専
用で開く、ということになります。
この「r」は、上でも書きましたように、「引数(ひきすう)」と呼び、いく
つかのアルファベット一文字を書くことにより、いくつかの動作の仕方を指定
することができます。
今回は、「r」としましたが、その他のものも含めてお話すると、
----------------------------------------------------
引数 意味 ファイルが存在しない場合
----------------------------------------------------
r 読み込み専用 エラー
r+ 読み書き可能 エラー
w 書き込み専用 ファイルを作成
w+ 読み書き可能 ファイルを作成
a 追加書き込み専用 ファイルを作成
a+ 読み込み、追加可能 ファイルを作成
----------------------------------------------------
という具合になります。
今回の場合は、単純に「096-2.txt」の中身を読み取れればいいので、「r」を
指定した訳です。
以上までの流れをまとめると、
まず、「$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");」
という部分を実行し
↓
それから
-------------------------------------------------------------------------------
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力:<input type="text" name="text01" value="<?php print($text01) ?>">
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
の内容を実行するので、結果としては
-------------------------------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");
?>
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力:<input type="text" name="text01" value="<?php print($text01) ?>">
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
という具合になります。
でも、このままの状態で実行しても、多分、エラーとなるでしょう。
(↑実際に確認はしていませんが。。。)
なぜなら、上記PHPプログラムの中で、変数「$file」と「$text01」を結びつけ
る内容が、どこにも書いてないからです。
■fgets関数■
ここで、以前のメルマガでチラッと出ましたが、再び「fgets (File Get)」関
数に登場してもらいます。
fgets関数は、fgets()という具合に書き、「()」の中身を指定することによ
り、その動作を発揮することができます。
ここで、少々堅苦しく書くと、
「fgets()関数」
fopen()関数 で開いたファイルの、指定したファイル名の1行を取出しま
す。
取出す場合には、引数で最大バイト数を指定しますが、省略した場合には
自動的に 1024バイト(日本語で 512文字分)になります。
となり、今回の場合は、
$text01 = fgets($file);
という具合に書くことにより、ここで、初めて、変数「$file」と「$text01」
を結びつけることができます。
今回の場合、「096-2.txt」の内容が非常に短い文章なので、上の「fgets()関
数」の「引数(ひきすう)」の部分は省略しましたが、この「096-2.txt」の中
身が、非常に長い場合(正確には、日本語で512文字以上ある場合)
$text01 = fgets($file,文章(テキスト)ファイルの文字数);
という具合に、具体的な文字数を指定する必要があります。
例 $text01 = fgets($file,2048);
この場合、日本語で1024文字分を取り出すことになります。
日本語一文字は、コンピュータでは2バイトとなるので、2048÷2=1024
となります。
さて、以上の内容を結合すると、
-------------------------------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");
$text01 = fgets($file);
?>
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力:<input type="text" name="text01" value="<?php print($text01) ?>">
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
という具合になり、ようやく、ここで初めて、目出度く、ブラウザに表示され
る一行テキストボックスに、サーバーのハードディスク上に保管してある「09
6-2.txt」の内容を読み込むことが可能になります。
今回の場合、これはこれでエラーも出ずに、何とかなりましたが、ここで、最後に
「fclose($file);」
という一行を加えておきます。
(最終形)
-------------------------------------------------------------------------------
<?php
$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");
$text01 = fgets($file);
fclose($file);
?>
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力:<input type="text" name="text01" value="<?php print($text01) ?>">
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
この「fclose($file);」というのは、「fclose (File Close)」関数で、最初に
「fopen (File Open)」関数で開いたファイルをお行儀良く、「開いたファイル
は、最後に閉じる」という意味です。
いまいちピンと来なかった場合は、日常使うワードやエクセルでの、「ファイ
ル(F)」→「閉じる(C)」と同じ操作を行う、というイメージです。
今回の場合は、「fclose($file);」がなくても、エラーとなりませんでしたが、
もっと大きなPHPプログラムを作成した場合、思わぬところでエラーとなってし
まう可能性があるので、一度、ファイルを開いた後のお決まりの文章と考えて
くださって結構です。
さてさて、これで何とか一連のPHPプログラムのキモの部分のお話は完了しまし
た。
最後は、この一行テキストボックスに呼び出された内容を再び、サーバーのハ
ードディスクに保存、という具合になりますが、今回も、またまた、長〜い内
容となってしまったので、最後のこの処理の部分は、また、次回と言うことで
ご容赦願います。
次回は、短くて済むかな?