第3講
サーバサイドスクリプト
PHP を実感しよう!
クライアントサイドでは、HTML に埋め込んだ(あるいは別ファイルから HTML に読み 込まれた)JavaScript によって、さまざまな処理や動的ページの生成を行えることは、すで に第3講までで学習しました。 しかし、HTML と JavaScript の組合せではどうしても出来ないことがあります。それは、 データの永続化(保持・保存)です。アクセスするごとにデータは新規のものとなり、前回 アクセス時のデータを再利用することができません。 この点、サーバサイド技術を利用すれば、データの永続化は容易に実現できます。データ ベースやテキストファイル、あるいは XML ファイルなどの外部リソースの利用が、その代 表例と言えます。 そこで、手始めに、Web ページから入力されたデータをサーバに送り、これを PHP プロ グラムによってテキストファイルに保存する技術を体験してみましょう。 せっかくですから、みなさんが、日ごろの学習の中でメモしておかなくてはと思う事柄を 記録しておけるよう、備忘録「Forget-Me-Not システム」(通称:忘れな草システム)を作っ てみます。Forget-Me-Not システムの概要
今回チャレンジするシステムは、次のようなものです。 (1) ブラウザからアプリケーションにアクセスすると、「科目」「キーワード」「説明文」を入 力するためのWeb ページが表示される。 (2) データを入力して[送信]ボタンを押すと、データがサーバサイドプログラムに送られる。 (3) サーバサイドプログラムが、受け取ったデータを格納しやすくする処理を行った上で、外 部リソースであるテキストファイルに書き込み、再び入力ページを表示する。 データ送信 データ 書込み サーバ テキスト ファイル PHP プログラム ブラウザ[1]アプリケーション用フォルダの準備 xampp¥htdocs に「notebook」フォルダを新規に作成します。 [ xampp ] └─ [ htdocs ] └─ [ notebook] [2]データ入力用ページの作成 (1) エディタで、以下のコードを入力します。
<html>
<head>
<title>プログラミングⅠ:Forget-Me-Not</title>
</head>
<body>
<h1>Forget-Me-Not : Write to Text<hr/></h1>
<form action="file_writer.php" method="POST">
<p>科 目:
<input type="text" name="subject" size="20" maxlength="30" /></p>
<p>項 目:
<input type="text" name="topic" size="20" maxlength="50" /></p>
<p>コメント:
<input type="text" name="comment" size="70" maxlength="255" /></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>
[ 分析 ]ほとんどHTML そのものです。
違っているのは、form の action 属性の値が file_writer.php となっているところぐらい ですが、これがデータの送り先となるサーバサイドプログラムです。
(2) 入力が完了したら、1.で準備した「note」フォルダ直下に次の要領で保存します。 ファイル名「input_text.php」 ファイルの種類「すべてのファイル」 ファイルの保存先「notebook」 文字コード「UTF-8」 [3]サーバサイドプログラムの作成 (1) テキストエディタで、新規に以下のコードを入力します。
<?php
$file = fopen( 'note.txt', 'ab' );
// ファイルを開く(なければ作る)
flock( $file, LOCK_EX );
// ファイルをロック(編集用)
$line = date( 'Y 年 m 月 d 日 H:i:s' )."¥t";
// 書き込みデータの設定
$line .= $_POST['subject']."¥t";
// データの受け取り
$line .= $_POST['topic']."¥t";
// データの受け取り
$line .= $_POST['comment']."¥t"
; // データの受け取りfputs( $file, $line."¥n" );
// ファイルへの書き込み
fclose( $file );
// ファイルを閉じる// 後処理:リダイレクトのためにヘッダ情報を出力
header( 'Location: http://localhost/notebook/input_text.php' );
[ 分析 ] 1行目の <?php は、ここから PHP プログラムが始まることを意味します。 2 行目の $(ドルマーク)が付いているのは「変数」です。 fopen() は PHP が提供しているファイル関数です。指定のファイル(note.txt)を、書 き込み専用(追記形式、ファイルがなければ新規に作成する)で開くという意味です。 この関数の処理結果は「ファイルハンドル」として返されます。これを変数$file に代 入しています。 3 行目の flock() も PHP が提供しているファイル関数で、指定のファイルをロックし ます。LOCK_EX は、書き込み中につき他のプログラムによる読み書きを禁止するとの 意味をもつ定数です。 4 行目は、書き込み用データを示す変数 $line に「書き込み年月日と日時」を設定。 5 行目~7行目は、 input_text.php から POST メソッドを使って送信されてきたデー タを受け取って、変数 $line に追加しています。$_POST['subject'] は、グローバル変 数といって、POST メソッドで送信されてきたパラメータ subject の値を受け取る仕組 みです。また、$line .= は、すでに $line に代入された値に、右辺の値を連結するという意味を 持ちます。右辺末尾の ."¥t" はデータの区切り文字(デリミッタ)として「タブコード」 を付加することを意味します。 8 行目の fputs() も ファイル関数で、指定ファイルにデータを書き込みます。 9 行目の fclose() もファイル関数で、開いたファイルを閉じます。 11 行目の header() は、ヘッダ関数といい、ここでは、元の入力用ページにリダイレク トするためのメタ情報を出力しています。 (2) 入力が完了したら、次の要領で保存します。 ファイル名「file_writer.php」 ファイルの種類「すべてのファイル」 ファイルの保存先「notebook」 文字コード「UTF-8」 [4]アプリケーションの実行 出来上がったアプリケーションを実行してみましょう。 (1) xampp¥xampp_control.exe のダブルクリックで XAMPP コントロールを起動 (2) XAMPP コントロール画面で[Start]ボタンをクリックして Apache を起動
Apache は Web ブラウザ (3) Web ブラウザを起動 (4) URL から http://localhost/notebook/input_text.php にアクセス 画面に次のように表示されれば成功。 Apache の右隣に、 グリーンベルトに Running の文字が 表示されればOK.
(5) 以下のデータを入力して[送信]ボタンを押す。 入力例 科目: プログラミングⅠ 項目: PHP コメント: サーバサイドスクリプト言語。初心者に優しい。 ⇒[送信]ボタンを押して、エラーが表示されずに、再び (4) の画面になれば成功。 (6) 結果の確認 正しく動作すれば、フォルダ[notebook]内に、「note.txt」というテキストファイル が作られていて、しかも、そこには入力ページから送られたデータが「タブ区切り」で格 納されているはずです。
Forget-Me-Not システムの拡張 もう少し、PHP の威力を実感してみましょう。 今度は、Forget-Me-Not システムを拡張して、保存したデータをテキストファイルから読み 込んで一覧表示する機能を追加してみます。 [1]サーバサイドプログラムの作成 (1) エディタで次のコードを入力します。
<html>
<head><title>プログラミングⅠ:Forget-Me-Not</title></head>
<body>
<h1>Read from Text</h1>
<?php
// PHP 開始$file = fopen( 'notebook.dat', ' rb' );
// ファイルを開くflock( $file, LOCK_SH );
// ファイルをロック// ファイルから最大 1024 バイトまで読み込む
while( $data = fgets( $file, 1024 ) ) {
// タブ記号を区切りにトークンに分割し // 変数$row に格納する
// 変数$row は自動的に配列となる
$row = explode( "¥t", $data );
?>
// いったん PHP を終了
<ul>
// リスト表示のための HTML タグ<li>
<?php print($row[1]); ?>
</li>
// 配列$row の 2 番目の要素を出力<li>【
<?php print($row[2]); ?>
】
</li>
// 配列$row の 3 番目の要素を出力<li>
<?php print($row[3]); ?>
</li>
// 配列$row の 4 番目の要素を出力<li>
<?php print($row[0]); ?>
</li>
// 配列$row の 1 番目の要素を出力</ul>
<hr color="#ffaa66" />
// 水平線を描くための HTML タグ<?php
// 再び PHP を開始}
// while 文終了fclose($file);
// ファイルを閉じる?>
// 再び PHP を終了</body>
</html>
[ 分析 ] 6 行目は、ファイルを読み込み専用で開きます。 7行目は、ファイルのロックですが、LOCK_SH は「共有ロック」といい、読み込み中 につき他のプログラムによる書き込みを禁止するという意味を持つ定数です。 9 行目から始まる while() { } は、繰り返し処理を行うための制御文です。()内の条件が true の間、{ }内の処理を繰り返します。
()内の $data = fgets( $file, 1024 ) は、fgets() 関数を使って、指定のファイルから最 大1024 バイトまで読み込んで、変数$data に格納するというものですが、読み込むデー タがなくなると、この関数はfalse を返します。false が返ってきたら、while 文の処理は 終了します。
12 行目は、読み込みデータを格納した変数$data からタブ記号を区切り文字としてデー タを分割します(分割によってできる細切れデータを「トークン」といいます)。トーク ンは変数$row に格納され、$row は自動的に配列となります。
15 行目から 18 行目は、「PHP スクリプトは HTML タグ内に埋め込む」の実践です。リ スト表示のためのHTML タグ<li> ~ </li> の中に <?php $row[1] ; ?> が埋め込まれてい ます。内容は、配列$row の 2 番目の要素を表示するというものです。[1] なのに 2 番目 というのは違和感があるかも知れませんが、配列の要素は 0 から始まるからです。 なお、while 文の途中で、いったん PHP を終了していますが、これは、HTML 内に埋め 込む方式で記述するスクリプト言語としては、ごく普通のやり方です。 途中で終了して、必要なHTML を記述して、再び PHP を開始している 21 行目に注目し てください。 このように記述しても、PHP 実行エンジンは、そのページ全体で1つのスクリプトとし て扱いますから、問題がないのです。 (2) 入力完了後はファイルを保存します 先ほどのnote フォルダに、ファイル名「file_reader.php」として保存します。 [2]アプリケーションの実行 XAMPP コントロールが起動していて、Apache も起動していることを確認して、 ブラウザのURL から次のようにアクセスします。
http://localhost/notebook/file_reader.php
⇒ 次のように表示されれば成功です。 . これで、Forget-Me-Not アプリケーション(テキストファイル版)は完成です。 どうでしょう。PHP の威力を実感できたでしょうか。 多少難しい箇所もありましたが、心配はいりません。これから先は、PHP の基礎から順に 学習していきますから、再びこのレベルに到達する日も、そう遠くはないはずです。