PHPでショッピングカートを!【6.カート商品の数量と重複チェック】

PHP

前回、簡単なショッピングカートを作ってみました。

カートの課題として
1.数量を入力できるようにすること
2.同じ商品が入らないように重複チェックすること
があります。

商品一覧に数量を入れる

まずは、数量を入力できるようにするために
商品一覧を修正します。

ファイル名:item_list.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品一覧</title>
    <style type="text/css">
<!--
table {margin: 10px;padding: 10px;}
table tr:nth-child(even) {background: honeydew;}
table tr:nth-child(odd) {background: lightgreen;}
table tr th,td {border-bottom: 1px solid forestgreen; padding: 2px 5px; text-align: center;}
table .right{text-align: right;}
.btn{background:mediumaquamarine;border-radius: 10px;border: 3px solid darkgreen;padding: 6px 10px; margin-left: 120px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php

try
{

require_once('../com_func.php');
$dbh=dbconnect();
$dbh->query('SET NAMES utf8');

$sql='SELECT id,name,price FROM goods';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$dbh=null;

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

print '<h3>商品一覧</h3>';
print 'カートに入れる商品を選択してください。<br>';
print '<table><tr>';
print '<td>商品名</td><td>価格</td><td>数量</td><td>カート</td></tr>';

while(true)
{
  $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  if($rec==false){break;}
  $id=$rec['id'];
  $name=$rec['name'];
  $price=$rec['price'];
  print '<tr>';
  print '<form method="post" action="item_cart.php">';
  print '<input type="hidden" name="id" value="'.$id.'">';
  print '<td><input type="hidden" name="name" value="'.$name.'">'.$name.'</td>';
  print '<td class="right"><input type="hidden" name="price" value="'.$price.'">'.number_format($price).'</td>';
  print '<td><input type="text" name="num" value="1" style="width:30px;"></td>';
  print '<td><input type="submit" value="カート"></td></form>';
}
print '</tr></table>';
?>
<button class="btn" onclick="location.href='shop_top.php'">トップページへ</button>

      </section>
    </main>
  </body>
</html>

修正箇所

46行目:表示順を変更し、数量を入れました。
55~61行目:上記見出しに合わせ変更しました。

ここでは、今までの表示順
(カート、商品ID、商品名、価格)を
数量を追加し、新しい表示順
(商品名、価格、数量、カート)
に変更しました。

商品IDは表示する必要がないから
表示しないようにしました。

これで、数量を入力できるようになりました。

カートに入れる商品の重複チェック

次に、カートに同じ商品が入らないように
重複チェックする必要があります。

先ほどの数量入力をカートに反映させる
と共に合計金額を表示できるようにします。

ファイル名: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;}
.btn{background:mediumaquamarine;border-radius: 10px;border: 3px solid darkgreen;padding: 6px 10px; margin-left: 120px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php
require_once('../com_func.php');
$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;
}

print '<h3>ショッピングカート見本</h3>';
print '<table><tr>';
print '<td>No.</td><td>商品名</td><td>価格</td><td>数量</td>';
print '<td>小計</td></tr>';
$max=count($id);
if($max==0)
{
  print '<tr><td colspan="5">カートに商品が入っていません。</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>'.number_format($price[$i]).'</td>';
  print '<td>'.$num[$i].'</td>';
  $sub=$price[$i] * $num[$i];
  $sum += $sub;
  print '<td class="right">'.number_format($sub).'</td></tr>';
}
?>

  <tr>
    <td colspan="4" class="right">合 計</td>
    <td class="right"><?php print number_format($sum); ?></td>
  </tr>
  <tr>
    <td colspan="4" class="right">消費税</td>
    <td class="right"><?php print number_format($sum * 0.1); ?></td>
  </tr>
  <tr>
    <td colspan="4" class="right">合計金額</td>
    <td class="right"><?php print number_format($sum * 1.1); ?></td>
  </tr>
</table>

<br>
カートに追加しました。<br>
<br>
<button class="btn" onclick="location.href='item_list.php'">商品一覧に戻る</button>
<br><br>
<button class="btn" onclick="location.href='cart_clear.php'">カートを空にする</button>
      </section>
    </main>
  </body>
</html>

修正箇所

30・38・51・55行目:数量を追加しました。
31行目:$flag1 に偽(false)を入れます。

39~44行目:重複チェックです。

同じ商品がカートに入ったか確認(重複チェック)するために、
in_array関数を使います。
例:in_array(値1,配列1)
配列1の中に指定した値1があるかどうかを探します。

41行目に使っているalertは、JavaScriptで
アラート(警告)を表示させます。

書式例:alert(‘アラートメッセージ’);

なんでPHPの学習なのにJavaScriptなの?

と疑問に思うかもしれませんが、
アラートを簡単に表示させるためには、
JavaScriptのalertを使うのが便利だからです。

ここで使われている $flag1 は、重複チェックで
重複していた場合に真(true)
重複していない場合は偽(false)
を代入しています。

46行目:重複していない場合以下の処理を行います。

60~61行目:見出しの表示順を変え数量・小計を追加しています。
69行目:小計($sub)と合計($sum)とを初期化(0を代入)しています。
71~79行目:見出しに合わせて変更しています。

今までの表示順(ID、商品名、価格)
(No.、商品名、価格、数量、小計)
に変更しました。

72行目で $i1 に $i+1 を代入し、No.の値を
1から表示させるようにしています。

82~85行目:合計を表示させています。
86~89行目:消費税を表示させています。
90~93行目:合計金額を表示させています。

カートの動作確認

ここに記述している2ファイルをshopフォルダに
UTF-8として保存します。
[item_list.php][item_cart.php]

XAMPPのコントロールパネルを起動し、
[Apache]列の[Start]と[MySQL]列の[Start]
をクリックし[Apache]と[MySQL]とを起動させます。

[item_list.php]を実行してみてください。

商品一覧から[カサゴ]、数量[1]
[カート]をクリックします。

ショッピングカートにカサゴが1つ追加されました。
また追加するので、[商品一覧に戻る]をクリックします。

商品一覧から[サケ]、数量[5]
[カート]をクリックします。

サケが5つ追加され、合計もちゃんと表示されています。

また、商品一覧から[カサゴ]または[サケ]を追加すると
重複アラートが表示されますので[OK]をクリックすると閉じます。

動作確認が終わりましたら、XAMPPのコントロールパネルで
[Apache]列の[Stop]と[MySQL]列の[Stop]
をクリックし[Apache]と[MySQL]とを終了させてください。

これでショッピングカートらしくなったのではないでしょうか。

次は、カートの商品の数量変更個別削除
できるようにしてみます。

コメント

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