前回まで、準備段階として商品管理を作成しました。
ちょっと準備が結構かかりましたが、
今回から、いよいよショッピングカートです。
ではまず、shopフォルダを作成します。
場所はドキュメントルートの中のfshopフォルダの中です。
エクスプローラーのフォルダ表示では

phpフォルダがドキュメントルートになり、
その中にfshopフォルダがあり、
fshopフォルダの中にgoodsフォルダとshopフォルダが
あります。
ちなみに、ファイルのアイコンからわかるように
私はPHPをBracktsで編集しています。
一般的なショッピングカートは、
商品詳細ページの[カートに入れる]をクリックして
ショッピングカートに入れます。
今回簡単なショッピングカートの動作確認を
したいので、とりあえず商品一覧からそのまま
カートに入れます。
商品一覧
以前作成した商品一覧を修正してもいいのですが、
一覧から選択するので、商品修正:[goods_mod.php] を
利用します。
[goods_mod.php] をコピーしshopフォルダに入れ
ファイル名を[item_list.php]に変更し修正しましょう。
ファイル名: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>商品ID</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><td>';
print '<form method="post" action="item_cart.php">';
print '<input type="submit" value="カートに入れる"></td>';
print '<td class="right"><input type="hidden" name="id" value="'.$id.'">'.$id.'</td>';
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).'</form></td>';
}
print '</tr></table>';
?>
<button class="btn" onclick="location.href='shop_top.php'">トップページへ</button>
</section>
</main>
</body>
</html>
修正箇所は、
9~13行目:色を変更してみました。
43行目:[商品修正]を[商品一覧]に。
44行目:[修正する]を[カートに入れる]に。
46行目:[選択]を[カート]に。
56行目:フォームでの移動先を[item_cartin.php]に。
57行目:[選択]を[カートに入れる]に。
64行目:[goods_ctl.php]を[shop_top.php]、
[商品管理へ]を[トップページへ]に。
これで一応、商品をカートに入れる準備ができました。
商品をカートに入れるには、ほかのページに移動しても
商品データを保持し続ける必要があります。
そこで使うのが、$_SESSION(セッション)です。
詳しくは以前の記事でも説明していましたのでお読みください。
ショッピングカートのサンプル
ショッピングカートのサンプルです。
ファイル名: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'];
if(isset($_SESSION['id'])==true)
{
$id=$_SESSION['id'];
$name=$_SESSION['name'];
$price=$_SESSION['price'];
}
$id[]=$p_id;
$name[]=$p_name;
$price[]=$p_price;
$_SESSION['id']=$id;
$_SESSION['name']=$name;
$_SESSION['price']=$price;
print '<h3>ショッピングカート見本</h3>';
print '<table><tr>';
print '<td>ID</td><td>商品名</td><td>価格</td></tr>';
$max=count($id);
if($max==0)
{
print '<tr><td colspan="3">カートに商品が入っていません。</td></tr></table>';
print '<a href="item_list.php">商品一覧へ戻る</a>';
exit();
}
for($i=0; $i<$max; $i++)
{
print '<tr><td>'.$id[$i].'</td><td>'.$name[$i].'</td>';
print '<td>'.number_format($price[$i]).'</td>';
}
print '</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>
2行目:セッションをスタートさせています。
26~29行目:データを受け取りサニタイジングしています。
31行目:issetを使い$_SESSION[‘id’]が空かどうかを判断しています。
例:isset(変数)==true
※変数にデータが入っている場合[true]、空の場合[false]です。
ここでは、$_SESSION[‘id’]にデータが入っていたら
以下の処理(33~35行目)をするという意味です。
この処理は、セッションが空だと、
空のデータを変数に代入することになりますので
エラーを避けるためにif文で振り分けています。
33~35行目:今までカートに入れたデータを変数に代入しています。
37~39行目:現在のカートデータを代入しています。
40~42行目:全てのカートデータをセッションに保存しています。
47行目:$max変数に$idのデータ数を代入しています。
countは変数の要素の数を数える関数です。
例:count(変数)
複数の要素を入れることができる変数を配列といいます。
$id 変数は複数の要素が入っていますので配列です。
$_SESSION[‘id’]も追加で代入するので配列です。
48~53行目:$idが空ならカートに商品が入っていないと表示させます。
54~58行目:for文を使って商品ID等を表示させています。
for文は、繰り返し命令です。
例:for(条件){処理}
条件が真(true)の間処理を続けるという意味です。
$i=0:$i の初期値を0とする。
$i<$max:$max より $i が小さい間。
$i++:処理を行うごとに $i を1増やします。
という意味です。
$idの配列内のデータ数を$maxに代入し
その数だけfor文でループを組んで表示させています。
66行目:カートを空にする[cart_clear.php]へ移動します。
カートを空にする
カートを空にするファイルも作りました。
ファイル名:cart_clear.php
<記述例>
<?php
$_SESSION=array();
if(isset($_COOKIE[session_name()])==true)
{
setcookie(session_name(),'',time()-42000,'/');
}
@session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>カートを空にする</title>
<style type="text/css">
<!--
.btn{background:mediumaquamarine;border-radius: 10px;border: 3px solid darkgreen;padding: 6px 10px; margin-left: 120px;}
-->
</style>
</head>
<body>
<main>
<section>
カートを空にしました。<br>
<button class="btn" onclick="location.href='item_list.php'">商品一覧に戻る</button>
</section>
</main>
</body>
</html>
カートを空にするには、セッションのデータを削除します。
削除方法は、会員登録でログアウトした方法と同じです。
動作確認してみよう
ここに記述している3ファイルをshopフォルダに
UTF-8として保存します。
[item_list.php][item_cart.php][cart_clear.php]
XAMPPのコントロールパネルを起動し、
[Apache]列の[Start]と[MySQL]列の[Start]
をクリックし[Apache]と[MySQL]とを起動させます。
[item_list.php]を実行してみてください。
商品一覧画面が表示されましたので、[カートに入れる]をクリックします。

ショッピングカートに追加されました。
また追加するときは、[商品一覧に戻る]をクリックします。

終わりましたら、XAMPPのコントロールパネルで
[Apache]列の[Stop]と[MySQL]列の[Stop]
をクリックし[Apache]と[MySQL]とを終了させてください。
試しにいろいろ追加してみて気付いたと思いますが、
商品をカートに入れるだけで数量を指定できません。
それから、同じ商品も追加されています。

いろいろ課題はありますが、とりあえず動作確認は
出来たのではないでしょうか。
コメント