第 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 となっているところぐらい ですが これがデータの 送 り 先 となるサーバサイドプログラムです form 内 の name に 設 定 されたパラメータの 値 が 送 信 の 対 象 となります
(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 ブラウザ Apache の 右 隣 に グリーンベルトに Running の 文 字 が 表 示 されれば OK. (3) Web ブラウザを 起 動 (4) URL から http://localhost/notebook/input_text.php にアクセス 画 面 に 次 のように 表 示 されれば 成 功
(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 の 基 礎 から 順 に 学 習 していきますから 再 びこのレベルに 到 達 する 日 も そう 遠 くはないはずです