カート画面の実装(カートの追加および表示)
それでは、次にカート画面の実装に入ります。まずは、どのようにショッピングカートを実装するか、考えてみましょう。通常の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"]のイメージです。配列のそれぞれの要素の中身が、更に連想配列になっていることに注意してください。

カートの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">¥<?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を確認してみましょう。


