[PHP7.4.11]セッション管理によるショッピングカート作成

ベタのphpでショッピングカートを作成して、仕組みを理解する事が目的

### セッションの扱い
1. 商品情報を表示するPHPファイルを用意する
2. カートに入れたデータはセッションのキーを商品IDに設定し、個数を代入
3. カートの中身を見る為のPHPファイル、カートの中身を一括削除する為のPHPファイルを用意する

### 機能要件
– カートに追加した商品は「追加ボタン」の代わりに「追加済み」とする
– カートには「変更」と「削除」の2種類のボタンを用意
– カートで表示する商品はIDではなく、商品名

### ページ一覧
– 商品一覧(list.php)
– 商品追加(create.php)
– カート(cart.php) ※カートの中身一覧を表示
– カートの中身全削除(delete.php)
※商品画像は img/*.png

list.php (商品一覧)

<?php 
	session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>商品一覧</h1>
	<a href="cart.php">カートを見る</a>
	<table style="text-align=center">
		<tr>
			<th>画像</th><th>商品</th><th>数量</th><th>ボタン</th>
		</tr>
		<form action="create.php" method="POST">
		<tr>
			<td><img src="img/rolex.png" width="50px" height="50px"></td>
			<td>ロレックス ROLEX 腕時計 サブマリーナデイト 16610T </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="rolex_16610T">
				<?php if(isset($cart&#91;'rolex_16610T'&#93;)===true):?>
					<p>追加済み</p>
				<?php else: ?>
					<input type="submit" value="カートに入れる">
				<?php endif; ?>
			</td>
		</tr>
		</form>
		<form action="create.php" method="POST">
		<tr>
			<td><img src="img/omega.png" width="50px" height="50px"></td>
			<td>OMEGA SPEEDMASTER 腕時計 アナログ </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="OMEGA_323-21-40-44-01-001">
				<?php if(isset($cart&#91;'OMEGA_323-21-40-44-01-001'&#93;)===true):?>
					<p>追加済み</p>
				<?php else: ?>
					<input type="submit" value="カートに入れる">
				<?php endif; ?>
			</td>
		</tr>
		</form>
	</table>
</body>
</html>


うん、何となくイメージ通り

create.php(商品追加)

<?php
	session_start();
	// POSTデータをカート用のセッションに保存
	if($_SERVER&#91;'REQUEST_METHOHD'&#93;==='POST'){
		$product=$_POST&#91;'product'&#93;;
		$num=$_POST&#91;'num'&#93;;
		$_SESSION&#91;'cart'&#93;&#91;$product&#93;=$num;
	}
	$cart=array();
	if(isset($_SESSION&#91;'cart'&#93;)){
		$cart=$_SESSION&#91;'cart'&#93;;
	}
	var_dump($cart);
?>


OK ちゃんと渡されています。
※amazonだと、カートに入れると、「追加されました」ってページに遷移
※rakutenの場合はポップアップで「商品かごに追加しました」と表示して商品ページに戻る
※yahoo shoppingの場合は、「ショッピングカート一覧」に遷移

cart.php(カートの中身一覧)

<?php 
	session_start();
	$cart = array();

	if($_SERVER&#91;'REQUEST_METHOD'&#93;==='POST'){
		$product=$_POST&#91;'product'&#93;;
		$kind=$_POST&#91;'kind'&#93;;
		if($kind==='change'){
			$num=$_POST&#91;'num'&#93;;
			$_SESSION&#91;'cart'&#93;&#91;$product&#93;=$num;
		} elseif($kind==='delete'){
			unset($_SESSION&#91;'cart'&#93;&#91;$product&#93;);
		}
	}
	if(isset($_SESSION&#91;'cart'&#93;)){
		$cart=$_SESSION&#91;'cart'&#93;;
	}
	var_dump($_SESSION);
?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Cart</title>
</head>
<body>
	<h1>ショッピングカート</h1>
	<p><a href="list.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>
			<th>削除ボタン</th>
		</tr>
		<?php foreach($cart as $key=>$var):?>
		<tr>
			<td>
				<?php
					switch($key){
						case 'rolex_16610T':
							echo '<img src="img/rolex.png" width="50px" height="50px">';
							break;
						case 'OMEGA_323-21-40-44-01-001';
							echo '<img src="img/omega.png" width="50px" height="50px">'
							break;
					}
					?>
			</td>
			<td>
				<?php
					switch($key){
						case 'rolex_16610T':
							echo 'ロレックス ROLEX 腕時計 サブマリーナデイト 16610T ';
							break;
						case 'OMEGA_323-21-40-44-01-001';
							echo 'OMEGA SPEEDMASTER 腕時計 アナログ '
							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で行う

delete.php(中身全部削除)

<?php 
	session_start();
	$session_name=session_name();
	$_SESSION=array();
	if(isset($_COOKIE&#91;$session_name&#93;)===true){
		setcookie($session_name,'',time()-3600);
	}
	session_destroy();
	header('Location:cart.php');
	exit;
?>

OK, sessionで商品IDと商品数を管理していることを理解した。つまり、DB側で商品名、商品画像、料金などを持っておけば良さそう。
一応、amazon, rakuten, yahooがセッションをどう管理しているか見ておこうと思う。