特集
2004/01/23 23:50:00 更新
全3回「WebプログラミングPHP言語入門」
特集:第2回 ショッピングカートの作成で分かる「PHP」の力 (3/5)
遷移のあるスクリプト(1)
前章までは、PHPスクリプトの作成に必要な基礎知識について説明したが、この章では、遷移のあるスクリプトの書き方を説明する。
Webアプリケーションは、ユーザーの操作によって複数のページ間を遷移することで成り立っている。これを実現するには、ユーザーがどのような操作を行ったのかを判断し、その内容に応じてページを切り替える必要がある。
ここでは、シンプルなサンプルスクリプトを教材にして、順を追って説明する。
教材とするサンプルスクリプト<?php if (!array_key_exists("feel", $_POST)) { $msg = "気分を選択して[送信]ボタンをクリックして下さい"; } else { $msg = "{$_POST["feel"]}番目が選ばれました"; } ?> <html><body> <form action="<?=$_SERVER["SCRIPT_URL"]?>" method="post"> 気分: <select name="feel"> <option value="1">悲しい</option> <option value="2" selected>普通</option> <option value="3">嬉しい</option> </select> <input type="submit" value="送信"> </form> <?=$msg?> </body></html> |
このサンプルは、フォームのactionが自分自身(9行目で自身のURLを埋め込んでいる)であるため、[送信]ボタンをクリックしても、同じPHPスクリプトが再び実行される。しかし、初めてブラウザで表示した時と、[送信]ボタンをクリックした時で、動的にメッセージが変わっている点に注目してほしい。
1〜6行目で、POSTメソッドでリクエストされた時のクエリを調べている。関数array_key_existsを用いて連想配列 $_POST の中に"feel"という添字が存在するかを調べている。
もし、"feel"が存在する時は“○番目が選ばれました”というメッセージを、存在しない時は“気分を〜下さい”というメッセージを変数 $msg に代入している。この変数は、17行目でHTMLの中に埋め込まれて表示される。
もし、9行目のformタグを変更して、POSTメソッドではなくGETメソッドを使うとどうなるだろうか。サンプルでは、2〜3行目で参照している変数が$_POSTであるため、これを $_GET に置換しない限り、[送信]ボタンをクリックしてもメッセージは全く変化しなくなる。
もし、GETとPOSTの両方のメソッドで呼ばれる可能性がある場合は、$_GETや$_POSTを使わず、$_GETと$_POSTの内容を包括している$_REQUESTを使うと良いだろう。
遷移のあるスクリプト(2)
ここまでは、同一ページ内で遷移するスクリプトを作成したが、実際にWebアプリケーションを開発する場合は、複数のページ間を遷移させる必要がある。
一般的な入門記事であれば、HTMLと混在したPHPスクリプトを2つ以上用意して、お互いを遷移させるケースが多い。しかし、この手法ではサンプル程度のスクリプトにしか通用しないため、いずれ壁に当たってしまうだろう。そこで、今回は冒頭で話題に挙げたMVCという技法を少し意識したプログラミングを行う。
まずは、下記の3つのファイルを同じディレクトリ上に配置して、ブラウザからsample3-2.phpにアクセスして欲しい。
サンプル3-2:sample3-2.php<?php $tpl = "sample3-2a.tpl"; if (!array_key_exists("feel", $_REQUEST)) { $msg = "気分を選択して[送信]ボタンをクリックして下さい"; } else { $feel = $_REQUEST["feel"]; switch ($feel) { case 1: $msg = "悲しいのなら、別の気分を選びましょう"; break; default: $msg = "{$feel}番目が選ばれました"; $tpl = "sample3-2b.tpl"; break; } } include($tpl); ?> |
<html><body> <form action="<?=$_SERVER["SCRIPT_URL"]?>" method="post"> 気分: <select name="feel"> <option value="1">悲しい</option> <option value="2" selected>普通</option> <option value="3">嬉しい</option> </select> <input type="submit" value="送信"> </form> <?=$msg?> </body></html> |
<html><body> <form action="<?=$_SERVER["SCRIPT_URL"]?>" method="post"> <input type="submit" value="戻る"> </form> <?=$msg?> </body></html> |
これらのサンプルは、前章のスクリプトをベースに拡張したものである。しかし、2点ほど明確な相違点がある。
1つ目の相違点は、HTML部分を別のファイルとして切り出していることである。これは、制御(演算や条件分岐などの処理)と、表示(ブラウザへの出力)を完全に切り離すために行っている。どうしてこのような事をするのかについては、もう1つの相違点に関係してくるので後述する。
2つ目の相違点は、気分を選択して[送信]ボタンをクリックしたときの表示である。[送信]ボタンをクリックすると、[戻る]ボタンと「○番目が選ばれました」というメッセージだけのページへと遷移する。この[戻る]ボタンをクリックすれば、先程のページへ遷移する。
実は、2番目の相違点はこれだけではない。“悲しい”を選択して[送信]ボタンをクリックすると、同じページで、メッセージだけが変わるのだ。1つ目の相違点で説明した“制御”と“表示”に切り分けることで、このような処理が実現できるのだ。
sample3-2.phpの2行目で$tplに"sample3-2a.tpl"を代入している。この変数は、8〜16行目の条件判断で、気分が“悲しい”以外であった場合に"sample3-2b.tpl"が代入される。$tplは18行目のinclude文の引数として渡される。その結果、$tplの値をファイル名として該当ファイルが読み込まれ、そして実行される。
sample3-2.php の8行目にあるswitch文は、括弧内の値によって違う処理を行うのに適した制御構造である。変数の値によって違う処理を行う場合に、if文を列挙しなくても済むので、スクリプトが煩雑にならないというメリットがある。
次章は、いよいよお待ちかねのショッピングカートの作成を開始する。
[照井進吾,ITmedia]
Copyright © ITmedia, Inc. All Rights Reserved.