「オンラインストア」完成へ向けて各ファイルを再構築:今から始める MySQL入門(9)(3/4 ページ)
さていよいよ今回の本題です。「簡易オンラインストア」をDTO・DAOパターンを使って修正し、「簡易在庫管理システム」と統合します。処理を行う各ファイルとDAOとの関係は図1のようになります。
図1 統合システムの画面遷移と使用するテーブル、DAOクラス(図をクリックすると拡大します)
処理を行うmenu.php/confirm.php/purchase.phpの働きは以下のようになります。第5回で紹介している「簡易オンラインストア」の各ファイルの働きと比べ、機能上の大きな変更点はありません。
- menu.php
- カウントデータをMySQLのcountテーブルのmax_noカラムから読み込み注文番号を生成する
- 注文番号をセッション変数に格納
- カウントデータ読み込み後、カウント値を+1しmax_noカラムを更新する
- confirm.php
- 注文番号をセッション変数から$_SESSION["order_id"]で取得。注文番号がセットされていなければ強制終了
- 選択された各アイテムのidや個数を$_POST[]から取得し、DTO「Order_item」クラスにセットする。さらに「Order_item」クラスを配列化し、セッションオブジェクトに格納する。
- 氏名・郵便番号・住所を$_POST["name"],$_POST["zip_code"],$_POST["address"]に格納
- purchase.php
- 注文番号をセッション変数から$_SESSION["order_id"]で取得。注文番号がセットされていなければ強制終了。氏名・郵便番号・住所を$_POST[]変数から取得する。
- セッションオブジェクトから配列化されたDTO「Order_item」クラスを取り出し、配列を各Order_itemクラスに展開する。セッションオブジェクトにセットされていなければ強制終了。
- Order_itemクラスから注文を受けた各アイテムのidや個数を取り出す。そのほか注文番号・日付を付加する
- 受注データを2つのテーブルに登録
注文番号/現在日時/氏名/住所データはorder_mainテーブルに
注文番号/現在日時/アイテム名/個数はorder_itemテーブルに挿入
- order_mainテーブルとorder_itemテーブルへのデータ挿入は、トランザクションを使用し、データに一貫性を持たせる
まずmenu.phpに修正を加えます。
1 <?php
2 require_once("BaseDao.php");
3 require_once("Count.php");
4 require_once("CountDao.php");
5 require_once("Item.php");
6 require_once("ItemDao.php");
7
8 $count = new Count();
9 $count_dao = new CountDao();
10
11 session_start();
12 $count = $count_dao->currVal();
13 $_SESSION["order_no"] = $count->getMax_no();
14 ?>
... 以下省略 ...
42 <!-- フォーム開始 -->
43 <form action="confirm.php" method="POST" enctype="appli
cation/x-www-form-urlencoded" name="form1">
44
45 <?php
46 $item = new Item();
47 $item_dao = new ItemDao();
48
49 //商品アイテム一覧
50 foreach($item_dao->getAllItem() as $item){
51 //商品個数を選択するドロップダウンリストをあらかじめ作成
52 $qty_list = optionList($item->getId(),$item->getQty());
53 //以下在庫アイテム表示
54 ?>
55
56 <!--商品ID <?php print htmlspecialchars($item->getId(),
ENT_QUOTES); ?> -->
57 <table width="390" border="0" cellspacing="0" cellpaddi
ng="7" height="55" align="center">
58 <tr>
59 <td valign="top" width="40"><img src="https://image.itmedia.co.jp/ait/articles/0707/31/icon.jpg" width="40"
height="60" border="0"></td>
60 <td valign="top" width="350"><font size="2"><b><?php print
htmlspecialchars($item->getName(),ENT_QUOTES); ?></b><br>
61 <?php print htmlspecialchars($item->getDetail(),ENT_QUOTES
); ?></font><br>
62 <div align="right"><b>¥ <?php print htmlspecialchars($ite
m->getPrice(),ENT_QUOTES); ?> 円/1個 </b>
63 <?php print $qty_list; ?>
64 </div>
65 </td></tr>
66 </table>
67
68 <?php
69 //在庫アイテム表示ここまで
70 }
71 $item_dao = null;
72 ?>
... 以下省略 ...
91 <?php
92 //name属性の値に$idを指定した,最大$numまでのドロップダウン
リストを作成
93 function optionList($id,$num){
94 $id = htmlspecialchars($id,ENT_QUOTES);
95 $html = "";
96 if($num < 1){
97 $html .= "<font color=\"red\"><b>売り切れ</b></font>";
98 }else{
99 $html .= "<select name=\"$id\">";
100 $html .= "<option value=\"0\" selected>0</option>";
101 for($i = 1;$i <= $num;$i++){
102 $html .= "<option value=\"$i\">$i</option>";
103 }
104 $html .= "</select><b>個</b>";
105 }
106 return $html;
107 }
108 ?>
|
リスト6 menu.php
注文番号の生成/取得にはCountDaoクラスを使用するよう修正を加えます(8〜13行目)。CountDaoクラスのcurrVal()メソッドを使用することで(12行目)、現在値を取り出し、インクリメントした値でアップデートを行うことができます。
次に、ItemDaoを使用し商品名/商品id/在庫数/値段を取得します。この際商品の注文数をドロップダウンリストから選択できるよう、在庫数分の<select><option>...</select>を生成します。生成にはoptionList()関数を用意し、使用します(93〜107行目)。その際optionList()では在庫数が0を下回った場合に「売り切れ」と表示します。
フォーム内に商品アイテムを表示する際、在庫アイテムをリアルタイムに表示できるようItemDaoクラスを利用し、MySQLの「item」テーブルから値を取得し、表示しています(46〜71行目)。
50行目の「foreach($item_dao->getAllItem() as $item){」ではItemDaoクラスのgetAllItem()メソッドで「item」テーブルから全データを取得し、foreachを使用して、商品アイテムの数だけ商品データをDTOであるitemクラスに展開します。
商品アイテムの詳細を得るには「$item->getId()」のようにDTOのゲッターを使用します。menu.phpで注文を受け付ける際、個数に1以上が選択された商品アイテムを、商品idを変数名、その個数を値となるよう_$POSTを利用し、confirm.phpに引き渡します。
Copyright © ITmedia, Inc. All Rights Reserved.