前回、ショッピングカートを修正してみました。
今回は、カートの数量変更と削除が出来るようにします。
数量変更と削除をするために、[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つボタンを配置しています。
コメント