PHPでショッピングカートを!【7.カートの数量変更と削除】

PHP

前回、ショッピングカートを修正してみました。
今回は、カートの数量変更と削除が出来るようにします。

数量変更と削除をするために、[item_cart.php]
修正し、新たに[change_num.php]を作成します。

ショッピングカート見本

ファイル名:item_cart.php

<記述例>

<?php
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>ショッピングカート</title>
    <style type="text/css">
<!--
table {margin: 10px;padding: 10px;border-collapse: collapse;border: 2px solid dodgerblue;}
table tr:nth-child(even) {background: whitesmoke;}
table tr:nth-child(odd) {background: lightcyan;}
table tr th,td {border: 1px solid dodgerblue;padding: 2px 10px; text-align: center;}
table .right{text-align: right;}
.btnright{text-align: right; margin: 10px 20px;}
.txtbox{display: inline-block;margin: 5px;}
.btnbox{text-align: center; margin: 10px 0;}
.btn1{color: honeydew;font-size: 16px;background: gray;border-radius: 30px 0 0 30px;padding: 6px 20px;margin: 5px;}
.btn2{color: honeydew;font-size: 16px;background: dodgerblue;border-radius: 0 30px 30px 0;padding: 6px 20px;margin: 5px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section class="txtbox">

<?php
require_once('../com_func.php');
if(isset($_POST['id']))
{
  $post=sanitize($_POST);
  $p_id=$post['id'];
  $p_name=$post['name'];
  $p_price=$post['price'];
  $p_num=$post['num'];
  $flag1=false;
  if(isset($_SESSION['id'])==true)
  {
    $id=$_SESSION['id'];
    $name=$_SESSION['name'];
    $price=$_SESSION['price'];
    $num=$_SESSION['num'];
    if(in_array($p_id,$id)==true)
    {
      $alert = "<script type='text/javascript'>alert('その商品はすでにカートに入っています。');</script>";
      print $alert;
      $flag1=true;
    }
  }
  if($flag1==false)
  {
    $id[]=$p_id;
    $name[]=$p_name;
    $price[]=$p_price;
    $num[]=$p_num;
    $_SESSION['id']=$id;
    $_SESSION['name']=$name;
    $_SESSION['price']=$price;
    $_SESSION['num']=$num;
  }
}
else
{
  $id=$_SESSION['id'];
  $name=$_SESSION['name'];
  $price=$_SESSION['price'];
  $num=$_SESSION['num'];
}
print '<h3>ショッピングカート見本</h3>';
print '<form method="post" action="change_num.php">';
print '<table><tr>';
print '<td>No.</td><td>商品名</td><td>価格</td><td>数量</td>';
print '<td>小計</td><td>削除</td></tr>';
$max=count($id);
if($max==0)
{
  print '<tr><td colspan="6">カートに商品が入っていません。</td></tr></table>';
  print '<a href="item_list.php">商品一覧へ戻る</a>';
  exit();
}
$sum=0; $sub=0;
for($i=0; $i<$max; $i++)
{
  $i1=$i+1;
  print '<tr><td>'.$i1.'</td><td>'.$name[$i].'</td>';
  print '<td class="right">'.number_format($price[$i]).'</td>';
  print '<td><input type="text" name="num'.$i.'" style="width:30px;" value="'.$num[$i].'" class="right"></td>';
  $sub=$price[$i] * $num[$i];
  $sum += $sub;
  print '<td class="right">'.number_format($sub).'</td>';
  print '<td><input type="checkbox" name="del'.$i.'"></td></tr>';
}

print '<tr><td colspan="4" class="right">合 計</td>';
print '<td class="right">'.number_format($sum).'</td>';
print '<td></td></tr><tr>';
print '<td colspan="4" class="right">消費税</td>';
print '<td class="right">'.number_format($sum * 0.1).'</td>';
print '<td></td></tr><tr>';
print '<td colspan="4" class="right">合計金額</td>';
print '<td class="right">'.number_format($sum * 1.1).'</td>';
print '<td></td></tr></table>';
print '<input type="hidden" name="max" value="'.$max.'">';
print '<div class="btnright">';
print '<input type="submit" name="nchk" value="数量変更">';
print '<input type="submit" name="del" value="削除">';
print '</div>';
print '<div class="btnbox">';
print '<input class="btn1" type="submit" name="back" value="商品一覧に戻る">';
print '<input class="btn2" type="submit" name="next" value="ご購入手続きへ">';
print '</div></form>';
?>
      </section>
    </main>
  </body>
</html>

変更箇所は、数量変更と削除と分けて解説します。

カート商品数量変更

30行目:if(isset($_POST[‘id’]))
カートに追加した場合は $_POST[‘id’]にデータはありますが、
数量を変更したときはデータがありません。

カートに追加したときは、31~62行目の処理をし、
数量を変更したときは、64~69行目の処理を行います。

40~43行目65~68行目は同じ処理です。

71行目:formを使い[change_num.php]へデータを送ります。
88行目:inputで数量を入力できるようにする。
データを送るときnameで識別していますが、
数量の名前がすべてnumだと区別が付きません。

それで、商品ごとにnameをnum1、num2、num3、と
変更させると解決します。

PHPでは、
name=”num’.$i.'”
HTMLでは、
name=”num<?php print $i; ?>”>
と記述します。

104行目:$maxのデータをhiddenで隠して送ります。
ここで送る$maxのデータは、カートに入っている商品数です。

106~111行目:数量変更・戻る・購入手続きボタンを表示させます。
112行目:formを閉じます。

カートから商品を削除

74行目:削除の見出しを入れる。
78行目:列数が1つ増えたのでcolspanを5から6へ。
87・88・91行目:数字表示を右寄せに。

92行目:削除のためのチェックボックスを追加。
ここでも数量の時と同じようにnameを
del1、del2、del3、としています。

107行目:削除ボタンを追加。

これでショッピングカート見本ファイルの修正が
終わりです。

次は、数量変更と削除をするファイルです。

数量変更と削除をする

ファイル名:change_num.php

<記述例>

<?php
session_start();
session_regenerate_id(true);

require_once('../com_func.php');

$post=sanitize($_POST);

$max=$post['max'];
for($i=0; $i<$max; $i++)
{
  if(preg_match("/^[0-9]+$/",$post['num'.$i])==0)
  {
    print '数量に誤りがあります。';
    print '<a href="item_cart.php">カートに戻る</a>';
    exit();
  }
  if($post['num'.$i]<1 || 100<$post['num'.$i])
  {
    print '数量は1個以上、100個までです。';
    print '<a href="item_cart.php">カートに戻る</a>';
    exit();
  }
  $num[]=$post['num'.$i];
}

$id=$_SESSION['id'];
$name=$_SESSION['name'];
$price=$_SESSION['price'];

for($i=$max; 0<=$i; $i--)
{
  if(isset($post['del'.$i])==true)
  {
    array_splice($id,$i,1);
    array_splice($name,$i,1);
    array_splice($price,$i,1);
    array_splice($num,$i,1);
  }
}

$_SESSION['id']=$id;
$_SESSION['name']=$name;
$_SESSION['price']=$price;
$_SESSION['num']=$num;

if(isset($post['back'])==true)
{
  header('Location: item_list.php');
}
else if(isset($post['next'])==true)
{
  if(count($id)==0){
    header('Location: item_cart.php');
  }else{
    header('Location: inputinfo.html');
  }
}
else
{
  header('Location: item_cart.php');
}
?>

解説は、数量変更と削除と分けて解説します。

カート商品数量変更

2~3行目:セッションスタート
5行目:関数読み込み
7行目:フォームから送られたデータをサニタジング
9行目:送られた商品アイテム数を$maxに代入
10行目:for命令で $i=0 から1つずつ増やし($i++)
    商品アイテム数($max)だけ繰り返す。
12行目:入力された数量が半角数字かどうかチェック。
18行目:数量が1以上100までかどうかのチェック。
24行目:$num(数量)に今入力されている数量を代入。
27~29行目:$num 以外はセッションに保存されたデータを配列変数へ代入。
47~57行目:移動先を押されたボタンで振り分ける。
61行目:その他はカートに戻る。

カートから商品を削除

31行目:for命令で $i=$max(商品数)から
    1つずつ減らし($i–)0まで繰り返す。
33行目:削除のチェックが入っていたら以下の処理をする。

35~38行目:array_spliceで配列の要素を削除。

書式例:array_splice(配列変数,削除開始位置,削除する配列要素数);

例:array_splice($id,$i,1);
これは[$id]の[$i]番目を1つ削除するということです。

42~45行目:削除した後のデータをセッションに保存。

動作確認

動作確認してみましょう。

商品一覧[item_list.php]から[ヒラメ]、数量[3]
[カート]をクリックします。

ショッピングカートにヒラメが3つ追加されました。

[ヒラメ]の数量を[1]に変更し[数量変更]をクリックします。

[ヒラメ]の数量が[1]になり、小計合計等も修正されました。

[ヒラメ]の削除をチェックし、[削除]ボタンをクリックします。

[ヒラメ]が削除され、小計合計等も修正されました。

数量を[0]に変更し、[数量変更]をクリックすると、

「数量は1個以上、100個までです。」と警告表示されます。

カートの商品すべての削除チェックを入れ[削除]をクリックすると

「カートに商品が入っていません。」と表示されます。

これでショッピングカート見本[item_cart.php]
の修正はできました。

勘のいい方はわかったかもしれませんが、
[数量変更][削除]とどちらをクリックしても
同じ動作になります。

[change_num.php]をよく見ると、
[item_cart.php]のinputで送られる
nameが[nchk][del]を使っていません。

数量変更は、入力された数量の誤りをチェックし、
そのままカートに戻しているだけです。

削除は、削除のチェックが入っているかどうか
調べて削除しています。

ですから、数量変更と削除ボタンは1つでも
機能しますが名目上2つボタンを配置しています。

コメント

タイトルとURLをコピーしました