「簡易オンラインストア」の修正(2)
confirm.phpの修正
今度はconfirm.phpに修正を加えます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
confirm.phpでは、注文内容をフォームデータ($_POST)から取得します。商品アイテムごとの注文情報は「$_POST["商品id"]=注文個数」で取り出すことができます。15行目では$_POSTからキーを抜き出し「$idx => $val」でキーに対する値を取得しています(foreach($配列 as $キー => $変数))。
フォームデータ($_POST)には注文番号など商品以外の情報が含まれています。商品の情報だけを抜き出すように条件を設けます(16行目)。
Order_itemクラスを生成後(17行目)、セッターを使って商品idと注文個数を設定します(18、19行目)。Order_itemクラスは注文を受けた商品の個数分作成されます。処理を容易にするため配列に格納します(20行目)。何も注文がない場合は25行目のようなメッセージを出力し、処理を中断します。配列の要素数は「count($配列)」で調べることができます(23行目)。
Order_itemクラスが格納された配列を、次の画面であるpurchase.phpに引き渡すよう、セッション変数に格納します(29行目)。セッション変数には文字列や数値型のような基本型以外にも、オブジェクトをそのまま格納することができます。注文内容の確認のために出力されるリストは、この配列から再度Order_itemクラスを取り出し(94行目)、Order_itemクラスのゲッターで商品idや個数を取得します(95、101、104、112行目)。
商品名や単価は、先ほど取得した商品idを基に、ItemDaoクラスを通してItemクラスを生成し(95行目)、各値を拾い出します(101、108、110、111行目)。HTML出力を行う際はhtmlspecialchars()を使用し、特殊文字のエスケープを行います。SQLクエリに対する特殊文字の処理は、各DAOクラスで行うようにします。
confirm.phpでは、住所/氏名に加え郵便番号も入力できるようテキストフィールド(zip_code)を追加しています(135〜137行目)。JavaScriptの入力漏れチェックも同様に追加します(54〜56行目)。
なお今回は、各入力項目の入力規制は設けていません。ですがこのままでは、郵便番号欄に半角数字以外の文字が入力されるなど、想定していない文字列が登録される危険性があります。入力規制の方法については、次回説明を加えます。
purchase.phpの修正
続いてpurchase.phpに修正を加えます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
注文を確定するpurchase.phpでは、MySQLに関連する処理をDAOに切り離します。注文番号は重複のみ確認(32行目)します。本システムが払い出した注文番号以外が使用されていないか、不正な注文番号が使用されていないかなど、厳密な判定は割愛しているため注意してください。
重複がなければ処理を続行し、注文情報をorder_itemテーブルとorder_mainに登録します。この際、MySQLサーバに対するトランザクション処理(45行目)はOrder_mainDaoクラスで行います。purchase.phpではその結果を受け取り、エラーを表示するか、注文が確定したことを画面に表示します。
なおSQLクエリに対する特殊文字の処理は、各DAOクラスで行うようにします。
今回までで、この簡易オンラインショッピングサイトの大まかな処理の解説は終了です。次回はフォーム入力値のチェック方法やAjaxのバックエンドで動作するPHPなど、ユーザーインターフェイスを充実させる方法を紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.