SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

プログラミング未経験から始めるPHP入門

ECサイトの注文完了機能を作成しよう!
プログラミング未経験から始めるPHP入門~応用編(8)

第15回

注文確定処理の解説

 それでは、先ほど実装した注文確定処理を解説していきます。第8回の2ページ目をよく読み、テーブル設計を理解した上で読み進めてください。処理の大まかな流れとしては、次のようになります。

  1. d_purchaseテーブルへのレコード追加(1回のみINSERT
  2. d_purchse_detailテーブルへのレコード追加(商品の個数分INSERT
  3. カート内の商品を削除

 上記の手順に従って説明を進めていきます。

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文で用いられ、完了メッセージを表示するために使用されています。

まとめ

 それでは、今回のまとめです。

今回のまとめ
  • 現在時刻を取得するためには、SQLnow()という命令を用いる。
  • 直前に採番されたカラム値を取得するためには、$mdb2lastinsertid()命令を用いる。

 注文確定処理は複数テーブルへのINSERTが必要となり、プログラムも長く、複雑なものとなってきました。次回は、最後にブラッシュアップとして、プログラムをさらに安全で読みやすいものとするためのいくつかのテクニックを紹介したいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
プログラミング未経験から始めるPHP入門連載記事一覧

もっと読む

この記事の著者

大家 正登(オオイエ マサト)

デジタルハリウッド『PHP 講座』講師。学生時代、スペイン語を専攻していたものの何故かプログラム言語に心が傾き、近所のフリープログラマーに弟子入り修行。その後中堅 SIer に 3 年間所属し、現在はフリーエンジニア。仕事の傍らジャズを演奏し、コントラバス 2 台と同居中。(ITエンジニア・大家正登のWeb...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4684 2009/12/16 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー