SHOEISHA iD

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

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

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

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

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

第14回

カート画面の実装(カートの追加および表示)

 それでは、次にカート画面の実装に入ります。まずは、どのようにショッピングカートを実装するか、考えてみましょう。通常のECサイトでは、ショッピングカートに追加した商品は、ブラウザを閉じたタイミングで破棄される場合が多いです。

 このカート内の情報がブラウザを閉じた時点で破棄される仕組みは、第10回で実装したログイン機能によく似ています。一度ログインをしても、画面を閉じるとまた未ログイン状態に戻ってしまいます。このようにブラウザが閉じるまで保持される情報は「セッション」と呼ばれる機能を用いており、その正体は$_SESSIONと呼ばれる特殊な連想配列でした。今回のカート機能も、ログイン情報と同じくセッションを用いて実装します。

 それでは、セッションを用いてcart.phpを実装しましょう。今回は、既に実装済みのプログラムで先に動作確認を行い、その後で説明をします。サンプルソースのSTEP2フォルダの中にあるcart.phpをコピーし、C:\xampp\htdocs\ec\フォルダ以下に上書き保存してください。

 保存したら動作確認をしましょう。選んだ商品がカートに追加されていることを確認してください。

選んだ商品がカートに追加されているか確認
選んだ商品がカートに追加されているか確認

 それでは、プログラムの内容を説明をしていきます。

 まず、3行目を見てください。セッションを使用する場合、そのファイルの冒頭で、

session_start( );

と記述する必要がありました。

 次に、7行目では

if( !isset( $_SESSION["cart"] ) )
{
	// array() 命令で、空の配列を作成する。
	$_SESSION["cart"] = array();
}

と記述されていますが、ここで$_SESSION["cart"]という変数に複数の商品を保存するために、空の配列を用意しています。今回のプログラムでは連想配列$_SESSION$_SESSION["cart"]という名前を新たに割り当て、カートの商品を管理します。下図は、トランペットを2つ、コントラバスを1つ、ギターを1つ、カートに追加した場合の$_SESSION["cart"]のイメージです。配列のそれぞれの要素の中身が、更に連想配列になっていることに注意してください。

トランペットを2つ、コントラバスを1つ、ギターを1つカートに追加した場合のイメージ
トランペットを2つ、コントラバスを1つ、ギターを1つカートに追加した場合のイメージ

 カートの1番目の商品を表すには$_SESSION["cart"][0]、カートの2番目の商品を表すには$_SESSION["cart"][1]と記述します。さらにカートの1番目の商品の商品名(トランペット)を表すには、$_SESSION["cart"][0]["item_name"]と記述します。

 次に、実際に商品を追加している部分を見てみましょう。19行目以降の、次のソースを確認してください。

if( $_REQUEST["cmd"] == "add_cart")
{
	$sql = "select * from m_items where item_code = ? ";
	$stmt = $mdb2->prepare( $sql );
	$res = $stmt->execute(
		array( $_REQUEST["code"] )
	);
	if( $record = $res->fetchRow( MDB2_FETCHMODE_ASSOC ) ) 
	{
		$item["item_code"] = $_REQUEST["code"];
		$item["num"] = $_REQUEST["num"];
		$item["image"] = $record["image"];
		$item["item_name"] = $record["item_name"];
		$item["price"] = $record["price"];
		array_push( $_SESSION["cart"], $item );
	}
	$res->free();
}

 今回のECサイトでは、カートに格納する商品情報として「商品コード」「数量」「画像ファイル名」「商品名」「金額」を保存します。「商品コード」および「数量」以外の情報は、詳細画面からリクエストとして受け渡されません。従って、SQLのSELECT文を実行し、商品コードに紐づく「商品名」「金額」「画像ファイル名」を取得する必要があります。具体的には、次の部分です。

$sql = "select * from m_items where item_code = ? ";

 SQLを実行し、詳細画面から受け渡された「商品コード」および「数量」と、SELECT文で取得した「商品名」「金額」「画像ファイル名」を、$itemという連想配列に格納し、

array_push( $_SESSION["cart"], $item );

の部分で、配列の形をした$_SESSION["cart"]に要素を追加しています。

 array_push命令は配列に要素を追加するための命令で、

array_push( 配列名, 配列に追加したい変数名);

のように記述します。カートに商品を追加したら、カート内の商品を画面に表示します。80行目以降の以下の部分が表示している箇所です。

<?php
	// $_SESSION["cart"] をループし、カートの商品を表示する。
	if( isset ( $_SESSION["cart"] ) )
	{
		foreach( $_SESSION["cart"] as $cart )
		{
?>
                <tr>
                  <td class="tc1"><img src="img/thumb2/<?php print( $cart['image'] ); ?>"></td>
                  <td class="tc2"><?php print( $cart["item_name"] ); ?>(<?php print( $cart["num"] ); ?>個)</td>
                  <td class="tc3">&yen;<?php print( $cart["price"] ); ?></td>
                  <td class="tc4"><a href="item_detail.php?code=<?php print( $cart["item_code"] ); ?>">詳細へ</a></td>
                  <td class="tc5"><a href="cart.php?cmd=del&code=<?php print( $cart["item_code"] ); ?>">削除</a></td>
                </tr>
<?php
		}
	}
?>

 $_SESSION["cart"]は配列の形をしているため、foreachループを使えば配列の要素数、すなわちカート内の商品の回数だけループさせて表示できます。カート画面で右クリックして[ソースの表示]を選択し、生成されたHTMLを確認してみましょう。

カート画面のソースを確認
カート画面のソースを確認

次のページ
カート画面の実装(カートの削除)

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

プログラミング未経験から始めるPHP入門連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4585 2009/11/25 14:00

イベント

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

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

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

メールバックナンバー