連載第6回「DAOパターンですっきりコーディング!」ではDTO・DAOパターンを使って、データベースアクセスに関連する操作をItemDaoクラスに集約しました。DAOパターンを利用することで、データベースアクセスのような煩雑な手順を本来必要な処理から切り離し、PHPコードを簡素化できます。
今回は、ItemクラスやItemDaoクラスを実際に在庫管理システムに組み込み、在庫管理システム本体の処理がいかに簡素化されるかを確認してみましょう。
検索/挿入/更新/削除といった処理は、コマンドラインphpで利用できるものを前回作成しました。今回は、これを基にWebから使用できるものを用意します。その際、更新/削除/挿入などの処理ごとにPHPファイルを用意せず、1つのPHPファイルにまとめることにします(ItemDaoの利用で各処理が簡潔になっているため)。
なお、今回作成するファイルも第6回でインストールしたsample4.tgzに含まれています。前回に引き続きsample4.tgzを利用してください。
今回は、Item.php、ItemDao.phpに加えて「displayStock.php」と「updateStock.php」を新たに用意します。
図1 簡易在庫システムの画面構成(画像をクリックすると拡大します)
下記に、displayStock.phpとupdateStock.phpの特長を示します。
- displayStock.php
- ItemDaoのgetAllItem()メソッドを使って商品(在庫)一覧を表示
- 一覧表示の際、商品ごとに<form>〜</form>を作成して、各値をテキストフォーム上に表示
- 新規挿入用に空のテキストフォームを持ったフォームを1つ作成
- フォームに入力された商品id、商品名、商品詳細、価格、在庫数をupdateStock.phpに引き渡す
- ボタンのラベル名(UPDATE、DELETE、INSERT)を引き渡すことで、どの処理が実行されているかupdateStock.phpに通知
- updateStock.php
- フォームの値を抽出する際、displayStock.phpで押下されたボタンのラベル名を$_POST["button"]で取得
- ラベル名($_POST["button"])がUPDATEなら更新処理(ItemDaoのupdateItem()メソッドを実行)
- ラベル名($_POST["button"])がINSERTなら挿入処理(ItemDaoのinsertItem()メソッドを実行)
- ラベル名($_POST["button"])がDELETEなら削除処理(ItemDaoのdeleteItem()メソッドを実行)
- 処理が終了した後、完了結果を表示
それでは、displayStock.phpのソースコードをのぞいてみましょう。
1 <HTML lang="ja">
2 <HEAD>
3 <meta http-equiv="content-type" content="text/html;
charset=UTF-8">
4 <title>在庫管理:在庫一覧</title>
5 </HEAD>
6
7 <?php
8 require_once("Item.php");
9 require_once("ItemDao.php");
10
11 $item = new Item();
12 $item_dao = new ItemDao();
13 ?>
14
15 <BODY TEXT="black" BGCOLOR="white">
16 <!-- タイトル -->
17 <div align="center"><font size="5"><b>在庫管理 </b></font>
<font size="3">在庫一覧</b><br></font>
18 </div>
19 <hr width="600" align="center">
20
21 <?php
22 //アイテム一覧
23 foreach($item_dao->getAllItem() as $item){
24
25 $id = $item->getId();
26 $name = $item->getName();
27 $detail = $item->getDetail();
28 $price = $item->getPrice();
29 $qty = $item->getQty();
30
31 print <<<EOS
32 <!-- 更新(UPDATE)、削除(DELETE) -->
33 <form action="updateStock.php" method="POST"
enctype="application/x-www-form-urlencoded" name="form">
34 <table border="0" cellspacing="0" cellpadding="7" height="160"
align="center">
35 <tr>
36 <td valign="top" bgcolor="lightgreen">
37 <b>商品ID:$id</b><input type=hidden name="id" value="$id"><br>
38 <b>商品名:</b><input type=text name="name" size="48"
value="$name"><br>
39 <b>説明 :</b><br>
40 <textarea name="detail" cols="45" rows="4">$detail</textarea><br>
41 <b>価格:</b><input type=text name="price" value="$price"
size="5"><b>円/個</b>
42 <b>個数:</b><input type=text name="qty" value="$qty" size="5">
<b>個</b>
43 </td>
44 <td bgcolor="gray" align="center" width="70">
45 <input type="submit" value="UPDATE" name="button"><p>
46 <!-- 本当はこうしたいがIEのためできない <button type="submit" value="UPDATE" name="button">更新</button>
<p>-->
47 <input type="submit" value="DELETE" name="button"><p>
48 <input type="reset" value="RESET">
49 </td></tr>
50 </table>
51 </form>
52
53 EOS;
54 }
55 $item_dao = null;
56 ?>
57
58 <!-- 新規登録(INSERT) -->
59 <form action="updateStock.php" method="POST"
enctype="application/x-www-form-urlencoded">
60 <table border="0" cellspacing="0" cellpadding="7" height="160"
align="center">
61 <tr>
62 <td valign="top" bgcolor="pink">
63 <b>商品名:</b><input type=text name="name" size="48"><br>
64 <b>説明 :</b><br>
65 <textarea name="detail" cols="45" rows="4"></textarea><br>
66 <b>価格:</b><input type=text name="price" size="5"><b>円/個</b>
67 <b>個数:</b><input type=text name="qty" size="5"><b>個</b>
68 </td>
69 <td bgcolor="gray" align="center" width="70">
70 <input type="submit" value="INSERT" name="button"><p>
71 <input type="reset" value="RESET">
72 </td></tr>
73 </table>
74 </form>
75
76 <!-- フッター -->
77 <hr width="600" align="center">
78 <table width="600" border="0" align="center">
79 <tr>
80 <td align="right"><font size="2">@IT LinuxSquare「今から始める
MySQL入門」<br
81 >
82 2007/04/10作成</font></td>
83 </tr>
84 </table>
85
86 </BODY>
87 </HTML> |
リスト1 displayStock.php
1〜5行目がHTMLヘッダ、76〜87行目がHTMLフッタです。そのほかHTMLを用いて、新規登録のためのフォームを58〜74行目で作成します。7〜13、21〜56行目がPHPスクリプトです。
8、9行目
Item.php・ItemDao.phpファイルをrequire_once()で読み込みます。
11行目
Itemクラスを生成(インスタンス化)します。
12行目
ItemDaoクラスを生成(インスタンス化)します。
15〜19行目
HTMLを使ってタイトルを表示します。
23〜54行目
ここからが主な処理になります。まず、ItemDaoのgetAllItem()メソッドを使い、全商品アイテムを配列で受け取ります。配列からItem型を取り出し、foreach(){}で商品アイテムの数だけ更新・削除処理用のフォームを作成します。Item型から各変数を取り出す際は、Itemクラスのゲッターを使用します(25〜29行目)。
どのような処理を行いたいかupdateStock.phpに伝えるために、ボタンのラベル名を変数「button」に格納します。通常「更新」など日本語表記で分かりやすいボタン名を使用したいところですが、Internet Explorerの制限で「<button type="submit" value="値" name="名">ボタン名</button>」で正しく値が渡せないため45、47行目のように「<input type="submit" value="値" name="名">」を使用しています(コラム1参照)。
buttonタグを使用した場合、Internet Explorerとそれ以外のブラウザとで は挙動が異なります。例えば、次のようなbutton.htmlとbutton.phpを用意します。
・button.html
<form action="button.php" method="POST">
<button type="submit" name="button" value="button1">ボタン1</button>
</form> |
・button.php
<?php
print $_POST["button"];
?> |
Firefoxでbutton.htmlにアクセスし、「ボタン1」をクリックした場合は、次の画面でvalueに埋め込まれている「button1」が表示されます。
↓
これに対し、Internet Explorerでは、ボタンのラベルに使用されている「ボタン1」がそのまま表示されます。
↓