特集
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);
?> 
サンプル3-2a:sample3-2a.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> 
サンプル3-2b:sample3-2b.tpl

<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文を列挙しなくても済むので、スクリプトが煩雑にならないというメリットがある。

 次章は、いよいよお待ちかねのショッピングカートの作成を開始する。

前のページ | 1 2 3 4 5 | 次のページ

[照井進吾,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.