ベタのphpでショッピングカートを作成して、仕組みを理解する事が目的
### セッションの扱い
1. 商品情報を表示するPHPファイルを用意する
2. カートに入れたデータはセッションのキーを商品IDに設定し、個数を代入
3. カートの中身を見る為のPHPファイル、カートの中身を一括削除する為のPHPファイルを用意する
### 機能要件
– カートに追加した商品は「追加ボタン」の代わりに「追加済み」とする
– カートには「変更」と「削除」の2種類のボタンを用意
– カートで表示する商品はIDではなく、商品名
### ページ一覧
– 商品一覧(list.php)
– 商品追加(create.php)
– カート(cart.php) ※カートの中身一覧を表示
– カートの中身全削除(delete.php)
※商品画像は img/*.png
list.php (商品一覧)
<?php session_start(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>商品一覧</h1> <a href="cart.php">カートを見る</a> <table style="text-align=center"> <tr> <th>画像</th><th>商品</th><th>数量</th><th>ボタン</th> </tr> <form action="create.php" method="POST"> <tr> <td><img src="img/rolex.png" width="50px" height="50px"></td> <td>ロレックス ROLEX 腕時計 サブマリーナデイト 16610T </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="rolex_16610T"> <?php if(isset($cart['rolex_16610T'])===true):?> <p>追加済み</p> <?php else: ?> <input type="submit" value="カートに入れる"> <?php endif; ?> </td> </tr> </form> <form action="create.php" method="POST"> <tr> <td><img src="img/omega.png" width="50px" height="50px"></td> <td>OMEGA SPEEDMASTER 腕時計 アナログ </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="OMEGA_323-21-40-44-01-001"> <?php if(isset($cart['OMEGA_323-21-40-44-01-001'])===true):?> <p>追加済み</p> <?php else: ?> <input type="submit" value="カートに入れる"> <?php endif; ?> </td> </tr> </form> </table> </body> </html>
うん、何となくイメージ通り
create.php(商品追加)
<?php session_start(); // POSTデータをカート用のセッションに保存 if($_SERVER['REQUEST_METHOHD']==='POST'){ $product=$_POST['product']; $num=$_POST['num']; $_SESSION['cart'][$product]=$num; } $cart=array(); if(isset($_SESSION['cart'])){ $cart=$_SESSION['cart']; } var_dump($cart); ?>
OK ちゃんと渡されています。
※amazonだと、カートに入れると、「追加されました」ってページに遷移
※rakutenの場合はポップアップで「商品かごに追加しました」と表示して商品ページに戻る
※yahoo shoppingの場合は、「ショッピングカート一覧」に遷移
cart.php(カートの中身一覧)
<?php session_start(); $cart = array(); 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="en"> <head> <meta charset="UTF-8"> <title>Cart</title> </head> <body> <h1>ショッピングカート</h1> <p><a href="list.php">商品一覧へ</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> <th>削除ボタン</th> </tr> <?php foreach($cart as $key=>$var):?> <tr> <td> <?php switch($key){ case 'rolex_16610T': echo '<img src="img/rolex.png" width="50px" height="50px">'; break; case 'OMEGA_323-21-40-44-01-001'; echo '<img src="img/omega.png" width="50px" height="50px">' break; } ?> </td> <td> <?php switch($key){ case 'rolex_16610T': echo 'ロレックス ROLEX 腕時計 サブマリーナデイト 16610T '; break; case 'OMEGA_323-21-40-44-01-001'; echo 'OMEGA SPEEDMASTER 腕時計 アナログ ' break; } ?> </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>
各商品の数量変更、削除処理はcart.phpで行う
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; ?>
OK, sessionで商品IDと商品数を管理していることを理解した。つまり、DB側で商品名、商品画像、料金などを持っておけば良さそう。
一応、amazon, rakuten, yahooがセッションをどう管理しているか見ておこうと思う。