【サンプル】ショッピングカート(セッション)

(ブログ記事の一覧は「こちら」)

ショッピングカートのサンプルを確認していきましょう。
用意した商品に対して、個数を指定してカートに入れたり、個数の変更やカート内の削除を行うことができます。

セッションや配列の仕組みを利用します。
また、サンプルプログラムではDBは用意していませんので、必要な場合はサンプルプログラムを修正してください。

サンプルプログラム

流れは以下のようになっっています。

[index.php] <-> [cart.php] <-> [delete.php]

index.php

トップ画面では、カートに入れることのできる商品一覧の表示と、カートに入れる仕組みを用意します。

<?php
    session_start();

    // POSTで受け取った場合
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $product = $_POST['product'];
        $num = $_POST['num'];
        $_SESSION['cart'][$product] = $num;
    }

    $cart = array();

    if (isset($_SESSION['cart'])) {
        $cart = $_SESSION['cart'];
    }

    var_dump($cart);
?>

<html>
<head>
   <meta charset="UTF-8">
   <title>商品一覧</title>
</head>

<body>
<h1>商品一覧</h1>

<a href="cart.php">カートを見る</a>

<table style="text-align:center">
    <tr>
        <th>商品</th><th>数量</th><th>ボタン</th>
    </tr>
    <form action="" method="post">
    <tr>
        <td>マウス</td>
        <td>
            <select name="num">
            <?php for ($i = 1; $i < 10; $i++): ?>
            <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
            <?php endfor; ?>
            </select>
        </td>
        <td>
            <input type="hidden" name="product" value="pc_mouse">
            <?php if (isset($cart['pc_mouse']) === TRUE): ?>
            <p>追加済み</p>
            <?php else: ?>
            <input type="submit" value="カートに入れる">
            <?php endif; ?>
        </td>
    </tr>
    </form>

    <form action="" method="post">
    <tr>
        <td>キーボード</td>
        <td>
            <select name="num">
            <?php for ($i = 1; $i < 10; $i++): ?>
            <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
            <?php endfor; ?>
            </select>
        </td>
        <td>
            <input type="hidden" name="product" value="pc_keyboard">
            <?php if (isset($cart['pc_keyboard']) === TRUE): ?>
            <p>追加済み</p>
            <?php else: ?>
            <input type="submit" value="カートに入れる">
            <?php endif; ?>
        </td>
    </tr>
    </form>
</table>
</body>
</html>

HTML内にPHPのif文やfor文を用いる場合、最後の部分をわかりやすくするために、以下のような書き方もできます。

 <?php if (isset($cart['pc_mouse']) === TRUE): ?>
    <?php else: ?>
    <?php endif; ?>

    <?php for ($i = 1; $i < 10; $i++): ?>
    <?php endfor; ?>


cart.php

ショッピングカート画面では、トップ画面でカートに入れた商品の表示と、変更や削除の機能を用意します。

<?php
    session_start();

    $cart = array();

    // POSTで受け取った場合
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $product = $_POST['product'];
        $kind = $_POST['kind'];

        if ($kind === 'change') {
            $num = $_POST['num'];
            $_SESSION['cart'][$product] = $num;
        } elseif ($kind === 'delete') {
            unset($_SESSION['cart'][$product]);
        }

    }

    if (isset($_SESSION['cart'])) {
        $cart = $_SESSION['cart'];
    }

    var_dump($_SESSION);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>ショッピングカート</title>
</head>

<body>
<h1>ショッピングカート</h1>

<p><a href="./">商品一覧へ</a></p>
<p><a href="delete.php">カートをすべて空に</a></p>

<table style="text-align:center">
    <tr>
        <th>商品</th><th>個数</th><th>数量</th><th>変更ボタン</th><th>削除ボタン</th>
    </tr>
    <?php foreach($cart as $key => $var): ?>
    <tr>
        <td>
        <?php
        if ($key == 'pc_mouse') {
            echo 'マウス';

        } elseif ($key == 'pc_keyboard') {
            echo 'キーボード';
        }
        ?>
        </td>
        <td><?php echo $var ?></td>

        <!- 変更ボタン ->
        <form action="" method="post">
            <td>
                <select name="num">
                    <?php for($i = 1; $i <10; $i++):?>
                    <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
                    <?php endfor; ?>
                </select>
            </td>
            <td>
                <input type="hidden" name="kind" value="change">
                <input type="hidden" name="product" value="<?php echo $key ?>">
                <input type="submit" value="変更">
            </td>
        </form>

        <!- 削除ボタン ->
        <form action="" method="post">
            <td>
                <input type="hidden" name="kind" value="delete">
                <input type="hidden" name="product" value="<?php echo $key ?>">
                <input type="submit" value="削除">
            </td>
        </form>
    </tr>
    <?php endforeach; ?>
</table>
</body>
</html>

HTML内にPHPのforeach文を用いる場合、最後の部分をわかりやすくするために、以下のような書き方もできます。

 <?php foreach($cart as $key => $var): ?>
    <?php endforeach; ?>


delete.php

ショッピングカート画面で削除を洗濯した時に呼ばれます。画面は持っていません。

<?php
    session_start();

    $session_name = session_name();

    $_SESSION = array();

    // クッキーを削除
    if (isset($_COOKIE[$session_name]) === TRUE) {
        setcookie($session_name, '', time() - 3600);
    }

    session_destroy();

    header('Location: cart.php');

    exit;