前回、簡単なショッピングカートを作ってみました。
カートの課題として
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]とを終了させてください。
これでショッピングカートらしくなったのではないでしょうか。
次は、カートの商品の数量変更と個別削除が
できるようにしてみます。
コメント