検索
連載

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

Share
Tweet
LINE
Hatena

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

 さていよいよ今回の本題です。「簡易オンラインストア」を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に修正を加えます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 注文番号の生成/取得には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.

ページトップに戻る