注文確定処理の解説
それでは、先ほど実装した注文確定処理を解説していきます。第8回の2ページ目をよく読み、テーブル設計を理解した上で読み進めてください。処理の大まかな流れとしては、次のようになります。
d_purchaseテーブルへのレコード追加(1回のみINSERT)d_purchse_detailテーブルへのレコード追加(商品の個数分INSERT)- カート内の商品を削除
上記の手順に従って説明を進めていきます。
d_purchaseテーブルへのレコード追加
d_purchaseテーブルには「顧客コード」「購入日」「合計金額」の情報をINSERTする必要があります。このうち「合計金額」は、カート内の商品をループし、足し算で求める必要があります。その計算を行っているのが次の部分です。
// カート内の合計金額を計算する。
foreach( $_SESSION["cart"] as $cart )
{
$total_price += $cart["price"] * $cart["num"];
}
「+=」という記号は初めて出てきましたが、下記のプログラムと同じ意味を持ちます。
$total_price = $total_price + $cart["price"] * $cart["num"];
例えば、カートに3つの商品が入っている場合、このループは3回実行されます。それぞれの商品価格が10万、20万、30万だとしたら、$total_priceの中身は1回目のループでは10万、2回目のループでは30万、3回目のループでは60万というように、足しこまれていきます。
こうして求めた合計金額を、次の処理でd_purchaseテーブルに追加しています。
// d_purchase テーブルへの挿入 $sql = " insert into d_purchase( customer_code, purchase_date, total_price) "; $sql.= " values( ?, now(), ? ) "; $stmt = $mdb2->prepare( $sql ); $res = $stmt->execute( array( $_SESSION["customer_code"], $total_price ) );
購入日には「now()」という値を設定していますが、これは現在日時を取得するためのSQLの命令です。
d_purchse_detailテーブルへのレコード追加
d_purchase_detailテーブルには、「注文ID」「商品コード」「商品価格」「数量」を登録する必要があります。このうち、「注文ID(order_id)」は、d_purchaseテーブルのorder_idと同一の数値を入れる必要がありますが、これはd_purchaseテーブルで自動採番しています。直前に採番された番号を取得しているのが次の部分です。
$order_id = $mdb2->lastinsertid("d_purchase","order_id");
$mdb2->lastinsertid()は、MDB2が用意している命令です。括弧内にテーブル名とカラム名をカンマ区切りで列挙することで、直前に採番された番号を取得できます。
この命令で取得したorder_idを、以下の処理でd_purchase_detailに挿入しています。
// $_SESSION["cart"] をもう一度ループし、ループ内で詳細情報を取得して
// から d_purchse_detail に insert する。
$sql = " insert into d_purchase_detail( order_id, item_code, price, num ) ";
$sql.= " values( ?, ?, ?, ? ) " ;
$stmt = $mdb2->prepare( $sql );
foreach( $_SESSION["cart"] as $cart )
{
$res = $stmt->execute(
array(
$order_id,
$cart["item_code"],
$cart["price"],
$cart["num"]
)
);
}
カート内の商品を削除
下記の部分で、カートそのものを削除しています。
unset( $_SESSION["cart"] );
unset命令は、変数を破棄するための命令です。カート削除とともに処理が完了となり、
$is_order_done = 1;
としています。この変数は144行目以降にある
<?php
if( $is_order_done == 1 )
{
?>
<br>
注文が完了しました。<a href="item_list.php">商品一覧へ戻る</a>
<br>
<?php
}
?>
のif文で用いられ、完了メッセージを表示するために使用されています。
まとめ
それでは、今回のまとめです。
- 現在時刻を取得するためには、
SQLのnow()という命令を用いる。 - 直前に採番されたカラム値を取得するためには、
$mdb2のlastinsertid()命令を用いる。
注文確定処理は複数テーブルへのINSERTが必要となり、プログラムも長く、複雑なものとなってきました。次回は、最後にブラッシュアップとして、プログラムをさらに安全で読みやすいものとするためのいくつかのテクニックを紹介したいと思います。
