あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHP実習:ショッピングカートを作ろう

この本も終わりが見えてきました…!!

 

第12章-03 実習

今回は通販サイトで使われるようなショッピングカートを作る。

制作の流れは以下の通り。

  1. 商品情報を表示するphpファイルを作る
  2. カートに入れたデータはセッションのキーを商品IDに設定し、個数を代入する
  3. カートの中身を見るためのphpファイル、カートの中身を一括削除するためのphpファイルをそれぞれ用意する

要件定義は以下の通り。

  • カートに追加した商品には「追加ボタン」の代わりに「追加済み」と表示する
  • カートページには「変更」と「削除」の2種類のボタンを用意し、それぞれのボタンに対する処理を分岐させる
  • カートで表示する商品はIDではなく商品名にする

では、商品一覧画面を作っていく。

<?php
 session_start();
 //POSTデータをカート用のセッションに保存
?>
<html>
 <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="desk_01">
     <?php if(isset($cart['desk_01'])===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="chair_07">
     <?php if(isset($cart['chair_07'])===true): ?>
      <p>追加済み</p>
     <?php else: ?>
      <input type="submit" value="カートに入れる">
     <?php endif; ?>
    </td>
   </tr>
  </form>

  </table>
  </body>
</html>

 「カートに入れる」ボタンが2つ出てくるが、飛び先は同じページとする。一度決定した個数を変更するのはcart.phpで行うものとする。商品のセレクトボックスをforを使って組み立てる。optionのvalueは実際に渡される値、<option></option>の間は表示される値である。今回はどちらも$iを出力する。$cart['desk_01']は商品をカートに入れた場合のみ存在するキーなので、今回はこのキーをisset()でチェックして商品を追加済みかどうか判定していく。

次に、「カートに入れる」を押した後の商品追加の機能を作成する。

 <?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);
?>

 POSTデータとして$productと$numの2つが渡されているので取得しておく。$_SESSION['cart'][$product]=$numのタイミングで$_SESSION['cart']['desk_01']などのキーが新たに出来上がり、個数が値として格納される。実はこの1行こそ、カートシステムの根幹ともいえる部分である。セッションに値を格納した後で$cartにセッションの配列データを入れておく。これで商品一覧画面は完成。

次に、カートの中身の一覧画面を作成する。

<?php
 session_start();
 $cart=array();
 if(isset($_SESION['cart'])){
  $cart=$_SESSION['cart'];
  }
 var_dump($_SESSION);
?>
<html>
 <body>
  <h1>ショッピングカート</h1>
  <p><a href="index.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><tr>
   <?php foreach($cart as $key=>$var): ?>
    <tr>
     <td>
      <?php
       switch($key){
        case 'desk_01':
         echo '業務用デスク';
         break;
        case 'chair_07':
         echo '快適いす';
         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ではまずカートデータの取得を行う。セッションデータに$_SESSION['cart']が存在していないこともあるので、取得用の変数$cartを配列として初期化した後、isset($_SESSION['cart'])でキーの存在を確認している。カートデータには商品IDをキー、個数を値とした配列が格納されている。通常商品IDはデータベース挿入用の値として用いられるが、今回はswitch()を使って正式な商品名を表示させている。実際には商品名もデータベースに登録しておいて、そこからデータを引っ張ってくるのが一般的。今回は<form>が複数あるので、hiddenを使って処理の内容(変更or削除)と商品IDを渡す。

hiddenでkindと名付けた値を取得し、その後の処理を分岐させる仕組みを作る。

cart.phpの最初の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($_SESION['cart'])){
  $cart=$_SESSION['cart'];
 }
 var_dump($_SESSION);
?>

$kindには各種ボタンの役割(change or delete)が格納される。まずif文でそれぞれの処理を分岐させる。変更ボタンを押した場合は単純に既存のキーの値を上書きし、削除ボタンではunset()でキーの値そのものを削除する。

最後に、カートの中身を一括削除する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; 

header()では、「Location:」の後にURLを指定することで強制的にページをジャンプさせることができる。その後ろのプログラムが実行されないよう、exitをつけて明示的に処理を終了させる。このような処理のことを「リダイレクト」という。

これで完成。

f:id:R_de_aru:20180708164617p:plain

f:id:R_de_aru:20180708164631p:plain

f:id:R_de_aru:20180708164643p:plain

セッションを用いて各ページに商品情報を受け渡ししている。

今回はここまで。次回からはいよいよ本のまとめ。