「オンラインストア」完成へ向けて各ファイルを再構築今から始める MySQL入門(9)(3/4 ページ)

» 2007年07月31日 00時00分 公開
[鶴長鎮一@IT]

「簡易オンラインストア」の修正

 さていよいよ今回の本題です。「簡易オンラインストア」をDTO・DAOパターンを使って修正し、「簡易在庫管理システム」と統合します。処理を行う各ファイルとDAOとの関係は図1のようになります。

図1 統合システムの画面遷移と使用するテーブル、DAOクラス(図をクリックすると拡大します) 図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の修正

 まず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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。