PHP超入門 (54)
■いままでのおさらい■
前回から、かなり間が空いてしまいましたので、今までのおさらいを兼ねて、
今回がどの位置にいるのか確認をしたいと思います。
かなり前から続けている、このメルマガの内容ですが、流れとすれば、以下のようになります。
あるPHPを実行する(ブラウザでアクセスする)と、サーバーのフォルダにあ
るファイルの一覧が表示される
↓
表示されたファイルにはリンクが張られていて、それをクリックすると、ブ
ラウザ上にフォーム(テキストエリア)が表示され、同時に、その中にファ
イル(テキストファイル)の中身(文章)が表示される
↓
ユーザーは、フォーム(テキストエリア)内で、自由に文章が編集できる
↓
「保存」のボタンを押すと、編集された文章がテキストファイルとしてサー
バー上のハードディスクに再び保存される
ということを目的に、一連のお話をしています。
ここで、前回の内容をチラッとしますと、
とあるフォルダに保存されているファイルの一覧をブラウザに表示させる。
そして、表示されたファイル名にはリンクが張ってあり、その各リンクには、
「109-2.php」という、PHPプログラムに、表示されたファイル名を渡すような
形になっている。
という話まででした。
例をいうと、ブラウザに表示されている「test.txt」というファイル名があっ
たとすると、それにはハイパーリンクが張ってあり、
<a href='./109-2.php?hensuu01=test.txt'>test.txt</a>
これにより、「test.txt」というファイル名が、「hensuu01」という名前の変
数に取り込まれ、受けて側である「109-2.php」というPHPプログラムは、受け
取った「hensuu01」という変数から、「test01.txt」というファイル名を取り
出し、イロイロと処理することになます。
ここで、もしかしたら、眩暈を起こしてしまうかもしれませんが、実際のPHPプ
ログラムを再掲します。
フォルダにあるファイル名の一覧をハイパーリンクと共にブラウザに表示する
PHPプログラム「109-1.php」
----------------------------------------------------------------------------------------------
<?php
$dir_file = opendir( './' );
while( $file_name = readdir( $dir_file ) ){
print "<a href='./109-2.php?hensuu01="."{$file_name}"."'>"."{$file_name}"."</a>"."<br>";
}
closedir( $dir_file );
?>
----------------------------------------------------------------------------------------------
という例を書いてみました。
■受け取ったファイル名の内容をブラウザのフォーム内に表示する■
それでは、ファイル名を受け取った「109-2.php」というPHPプログラムには、
どうさせたらいいでしょうか?
ここで、最終目的である、ブラウザのフォーム内に、「test.txt」の中身とい
うか文章(テキスト)を表示させ、ブラウザ上で、いろいろと修正をしたいと
ころです。
先ずは、受け取った変数「hensuu01」からファイル名「test.txt」を取り出す
操作ですが、これについては、前回、超簡単なプログラム
------------------------------
<?php
$hensuu02 = $_GET["$hensuu01"];
print ($hensuu02);
?>
------------------------------
で解決済みです。
では、ここからが本番で、取り出したファイル名から、そのサーバーのハード
ディスクにあるファイルにアクセスして、そのファイルを開かなくてはいけま
せん。
ネタから先に言ってしまいますと、これは、このメルマガで、ず〜と以前に紹
介したPHPプログラムの一部を書き換えるだけで済みます。
そのPHPプログラムとは。。。
-------------------------------------------------------------------------------
<?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>
-------------------------------------------------------------------------------
です。
参考: http://www.e-and-a.ws/06/098.asp
上記のプログラムの
$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r")
の部分で、「096-2.txt」というファイルを読み込み専用で開く、という動作を
指定していますが、この中の「096-2.txt」をファイル名そのものではなく、変
数に変えてしまえばよいかもしれません。
そうすると、
こんな具合でいかがでしょうか?
-------------------------------------------------------------------------------
<?php
$hensuu02 = $_GET["hensuu01"];
$filePath = "C:\\inetpub\\wwwroot\\php\\" . $hensuu02;
$file = fopen($filePath,"r");
$text01 = fgets($file);
fclose($file);
?>
<html>
<head>
<title>入力フォーム</title>
</head>
<body>
<form action="096-3.php" method="post">
テキスト入力<br>
<FORM><TEXTAREA rows="10" cols="20"><?php print($text01) ?></TEXTAREA></FORM><br>
<input type="submit" name="bottun1" value="入 力">
</form>
</body>
</html>
-------------------------------------------------------------------------------
というものを考えてみました。
上記、PHPプログラムの
"C:\\inetpub\\wwwroot\\php\\096-2.txt"
で、変数の部分と、その他の部分に一度分解し、文字列を結合させる機能を持
つ「.」で、文字列を再構成しているところがミソです。
「$file = fopen("C:\\inetpub\\wwwroot\\php\\096-2.txt","r");」の行で、
一行に書いても良いのですが、そうすると、プログラムが見づらくなるので、
再構成する操作を別の一行に記述し、その再構成した内容を、一度「$filePat
h」という名前の変数に格納しているところが、チョット違うところです。
また、フォームの部分も、一行テキストエリアではなく、複数行テキスト領域
に変更してあります。
さて、以上のPHPプログラムを「109-2.php」という名前で、「C:\Inetpub\www
root\php」に保存します。
そして、テスト用に
あいうえお
カキクケコ
さしすせそ
と簡単な複数行の文章をメモ帳等で作成し、
「test.txt」という名前で「C:\Inetpub\wwwroot\php」に保存します。
それでは、早速、実験したいと思います。
まず、ブラウザを立ち上げ、そのアドレス欄に「http://localhost/php/109-1.
php」と入力すると、フォルダに保存されているファイル名の一覧がリンク付き
で表示されます。
その中で、先程、メモ帳で作った、テスト用テキストファイル「test.txt」の
リンクをクリックすると。。。
確かに、複数行テキスト領域に「あいうえお」と表示されるのですが、の残り
の「カキクケコ」「さしすせそ」が表示されません。
HTMLのソースを見ても、「あいうえお」しか見当たりません。
どういうことでしょうか???
実は、ファイルから文字列を取り出す関数である「fgets関数」に問題がありま
す。
以前、一行テキストボックスの時に出てきた、この関数ですが、その時の「fg
ets関数」の機能を見てみると、
「fgets()関数」
fopen()関数 で開いたファイルの、指定したファイル名の1行を取出しま
す。
取出す場合には、引数で最大バイト数を指定しますが、省略した場合には
自動的に 1024バイト(日本語で 512文字分)になります。
そう、この「fgets関数」の場合、複数行あっても、最初の一行しか取り出して
くれず、2行目以降は無視されていまうのです。
これでは、全く使い物になりません。
ここは、どうしても、複数行テキスト領域に、テキストファイル「test.txt」
の中身全部を表示させなければなりません。
そこで、次回はこの問題について対処したいと思います。
。。。続く