PHP実習:ショッピングカートを作ろう
この本も終わりが見えてきました…!!
第12章-03 実習
今回は通販サイトで使われるようなショッピングカートを作る。
制作の流れは以下の通り。
- 商品情報を表示するphpファイルを作る
- カートに入れたデータはセッションのキーを商品IDに設定し、個数を代入する
- カートの中身を見るためのphpファイル、カートの中身を一括削除するためのphpファイルをそれぞれ用意する
要件定義は以下の通り。
- カートに追加した商品には「追加ボタン」の代わりに「追加済み」と表示する
- カートページには「変更」と「削除」の2種類のボタンを用意し、それぞれのボタンに対する処理を分岐させる
- カートで表示する商品はIDではなく商品名にする
では、商品一覧画面を作っていく。
<?php
session_start();
//POSTデータをカート用のセッションに保存
?>
<html>
<body>
<h1>商品一覧</h1>
<a href="cart.php">カートを見る</a>
<table style="text-align=center">
<tr><th>商品</th><th>数量</th><th>ボタン<th></tr>
<form action="" method="POST">
<tr>
<td>業務用デスク</td>
<td>
<select name="num">
<?php for($i=1;$i<10;$i++): ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
<?php endfor; ?>
</select>
</td>
<td>
<input type="hidden" name="product" value="desk_01">
<?php if(isset($cart['desk_01'])===true): ?>
<p>追加済み</p>
<?php else: ?>
<input type="submit" value="カートに入れる">
<?php endif; ?>
</td>
</tr>
</form><form action="" method="POST">
<tr>
<td>快適いす</td>
<td>
<select name="num">
<?php for($i=1;$i<10;$i++): ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?></option>
<?php endfor; ?>
</select>
</td>
<td>
<input type="hidden" name="product" value="chair_07">
<?php if(isset($cart['chair_07'])===true): ?>
<p>追加済み</p>
<?php else: ?>
<input type="submit" value="カートに入れる">
<?php endif; ?>
</td>
</tr>
</form></table>
</body>
</html>
「カートに入れる」ボタンが2つ出てくるが、飛び先は同じページとする。一度決定した個数を変更するのはcart.phpで行うものとする。商品のセレクトボックスをforを使って組み立てる。optionのvalueは実際に渡される値、<option></option>の間は表示される値である。今回はどちらも$iを出力する。$cart['desk_01']は商品をカートに入れた場合のみ存在するキーなので、今回はこのキーをisset()でチェックして商品を追加済みかどうか判定していく。
次に、「カートに入れる」を押した後の商品追加の機能を作成する。
<?php
session_start();
//POSTデータをカート用のセッションに保存
if($_SERVER['REQUEST_METHOD']==='POST'){
$product=$_POST['product'];
$num=$_POST['num'];
$_SESSION['cart'][$product]=$num; //セッションにデータを格納
}
$cart=array();
if(isset($_SESSION['cart'])){
$cart=$_SESSION['cart'];
}
var_dump($cart);
?>
POSTデータとして$productと$numの2つが渡されているので取得しておく。$_SESSION['cart'][$product]=$numのタイミングで$_SESSION['cart']['desk_01']などのキーが新たに出来上がり、個数が値として格納される。実はこの1行こそ、カートシステムの根幹ともいえる部分である。セッションに値を格納した後で$cartにセッションの配列データを入れておく。これで商品一覧画面は完成。
次に、カートの中身の一覧画面を作成する。
<?php
session_start();
$cart=array();
if(isset($_SESION['cart'])){
$cart=$_SESSION['cart'];
}
var_dump($_SESSION);
?>
<html>
<body>
<h1>ショッピングカート</h1>
<p><a href="index.php">商品一覧へ</a><p>
<p><a href="delete.php">カートをすべて空に</a></p>
<table style="text-align=center">
<tr><th>商品</th><th>個数</th><th>数量</th><th>変更ボタン</th><th>削除ボタン<th><tr>
<?php foreach($cart as $key=>$var): ?>
<tr>
<td>
<?php
switch($key){
case 'desk_01':
echo '業務用デスク';
break;
case 'chair_07':
echo '快適いす';
break;
}
?>
</td>
<td>
<?php echo $var; ?>
</td>
<form action="" method="POST">
<td>
<select name="num">
<?php for($i=1;$i<10;$i++): ?>
<option value="<?php echo $i;?>"><?php echo $i; ?></option>
<?php endfor; ?>
</select>
</td>
<td>
<input type="hidden" name="kind" value="change">
<input type="hidden" name="product" value="<?php echo $key;?>">
<input type="submit" value="変更">
</td>
</form>
<form action="" method="POST">
<td>
<input type="hidden" name="kind" value="delete">
<input type="hidden" name="product" value="<?php echo $key;?>">
<input type="submit" value="削除">
</td>
</form>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
cart.phpではまずカートデータの取得を行う。セッションデータに$_SESSION['cart']が存在していないこともあるので、取得用の変数$cartを配列として初期化した後、isset($_SESSION['cart'])でキーの存在を確認している。カートデータには商品IDをキー、個数を値とした配列が格納されている。通常商品IDはデータベース挿入用の値として用いられるが、今回はswitch()を使って正式な商品名を表示させている。実際には商品名もデータベースに登録しておいて、そこからデータを引っ張ってくるのが一般的。今回は<form>が複数あるので、hiddenを使って処理の内容(変更or削除)と商品IDを渡す。
hiddenでkindと名付けた値を取得し、その後の処理を分岐させる仕組みを作る。
<?php
session_start();
$cart=array();if($_SERVER['REQUEST_METHOD']==='POST'){
$product=$_POST['product'];
$kind=$_POST['kind'];
if($kind==='change'){
$num=$_POST['num'];
$_SESSION['cart'][$product]=$num;
} elseif($kind==='delete'){
unset($_SESSION['cart'][$product]);
}
}
if(isset($_SESION['cart'])){
$cart=$_SESSION['cart'];
}
var_dump($_SESSION);
?>
$kindには各種ボタンの役割(change or delete)が格納される。まずif文でそれぞれの処理を分岐させる。変更ボタンを押した場合は単純に既存のキーの値を上書きし、削除ボタンではunset()でキーの値そのものを削除する。
最後に、カートの中身を一括削除するdelete.phpを作成する。
<?php
session_start();
$session_name=session_name();
$_SESSION=array();
if(isset($_COOKIE[$session_name])===true){
setcookie($session_name,'',time()-3600);
}
session_destroy();
header('Location:cart.php');
exit;
header()では、「Location:」の後にURLを指定することで強制的にページをジャンプさせることができる。その後ろのプログラムが実行されないよう、exitをつけて明示的に処理を終了させる。このような処理のことを「リダイレクト」という。
これで完成。
セッションを用いて各ページに商品情報を受け渡ししている。
今回はここまで。次回からはいよいよ本のまとめ。