//tips
//php理解
まずはカートに商品を入れていく。
カートは配列なので$cart[]=$pro_code;tpすることでカートに商品を入れている。画面遷移した後もカートに入れた情報を残すために$_SESSIONに保存している。
$cart[]=$_SESSION['cart'];
$cart[]=$pro_code;
$_SESSION['cart']=$cart;
とすることで以前の情報を引き継いだ後に新しいものを追加できる。
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['memberlogin'])==false){
print 'ようこそゲスト様 ';
print'<a href="member_login.html">会員ログイン</a><br/>';
print '<br/>';
}else{
print'ようこそ';
print $_SESSION['member_name'];
print'様 ';
print '<a href="member_logout.php">ログアウト</a><br/>';
print'<br/>';
}
?>
<body>
<?php
try{
$pro_code=$_GET['procode'];
$cart[]=$_SESSION['cart'];
$cart[]=$pro_code;
$_SESSION['cart']=$cart;
foreach($cart as $key=>$val){
print $val;
print '<br/>';
}
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
カートに追加しました<br/>
<br/>
<a href="shop_list.php">商品一覧に戻る</a>
</body>
一つ目の商品をカートに入れる場合は現状ではエラーが出てしまうので、
if(isset($_SESSION['cart'])==true){
$cart[]=$_SESSION['cart'];
}
としておく。
今度はカートの中身を見る機能を追加していく。
一旦var_dump($cart);で配列の内容全てをコード形式で表示し、確認を容易にしている。カートの中身を確認できれば良かったので、exitでプログラムを停止している。
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['memberlogin'])==false){
print 'ようこそゲスト様 ';
print'<a href="member_login.html">会員ログイン</a><br/>';
print '<br/>';
}else{
print'ようこそ';
print $_SESSION['member_name'];
print'様 ';
print '<a href="member_logout.php">ログアウト</a><br/>';
print'<br/>';
}
?>
<body>
<?php
try{
$cart=$_SESSION['cart'];
var_dump($cart);
exit();
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='SELECT name,price,gazou FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[]=$pro_code;
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$pro_name=$rec['name'];
$pro_price=$rec['price'];
$pro_gazou_name=$rec['gazou'];
$dbh=null;
if($pro_gazou_name==''){
$disp_gazou='';
}else{
$disp_gazou='<img src="../product/gazou/'.$pro_gazou_name.'">';
}
print '<a href="shop_cartin.php?procode='.$pro_code.'">カートに入れる</a><br/><br/>';
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
商品情報参照<br/>
<br/>
商品コード<br/>
<?php print $pro_code;?>
<br/>
商品名<br/>
<?php print $pro_name;?>
<br/>
価格<br/>
<?php print $pro_price;?>円
<br/>
<?php print $disp_gazou;?>
<br/>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
表示されたarray(1) { [0]=> string(1) "1" }はarray(1) で格納データ数が一つであることを示し、string(1)は文字の長さが1であることを指す。”1”が$cart[0]の中身となる。
さらに詳細を記載していく。
取り出したカートデータを、
$pro_name[]
$pro_price[]
$pro_gazou[]
の配列にデータを再配置している。
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['memberlogin'])==false){
print 'ようこそゲスト様 ';
print'<a href="member_login.html">会員ログイン</a><br/>';
print '<br/>';
}else{
print'ようこそ';
print $_SESSION['member_name'];
print'様 ';
print '<a href="member_logout.php">ログアウト</a><br/>';
print'<br/>';
}
?>
<body>
<?php
try{
$cart=$_SESSION['cart'];
$max=count($cart);
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
foreach($cart as $key=>$val){
$sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[0]=$val;
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$pro_name[]=$rec['name'];
$pro_price[]=$rec['price'];
if($rec['gazou']==''){
$pro_gazou[]='';
}else{
$pro_gazou[]='<img src="../product/gazou/'.$rec['gazou'].'">';
}
$dbh=null;
for($i=0;$i<$max;$i++){
print $pro_name[$i];
print $pro_gazou[$i];
print $pro_price[$i].'円';;
print '<br/>';
}
}
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
<form>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
今後の作業効率を上げるためカートを空にするスクリプトも作成しておく。
<?php
session_start();
$_SESSION=array();
if(isset($_COOKIE[session_name()])==true){
setcookie(session_name(),'',time()-42000,'/');
}
session_destroy();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログアウト</title>
</head>
<body>
カートを空にしました<br/>
</body>
これで任意にカートを空に出来るようになった。
カートに商品の数量も追加していく。
カート内の一覧を表示するループの外側をformでくくる形にし、inputで数量を入力できるようにした。
Forの中に書かれた<input type="text" name="kazu<?php print $i;?>" value="<?php print $kazu[$i];?>">は商品ごとに異なる名前をつけているkazu0,kazu1…というように数字によって識別可能にしている。
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['memberlogin'])==false){
print 'ようこそゲスト様 ';
print'<a href="member_login.html">会員ログイン</a><br/>';
print '<br/>';
}else{
print'ようこそ';
print $_SESSION['member_name'];
print'様 ';
print '<a href="member_logout.php">ログアウト</a><br/>';
print'<br/>';
}
?>
<body>
<?php
try{
$cart=$_SESSION['cart'];
$kazu=$_SESSION['kazu'];
$max=count($cart);
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
foreach($cart as $key=>$val){
$sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[0]=$val;
$stmt->execute($data);
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$pro_name[]=$rec['name'];
$pro_price[]=$rec['price'];
if($rec['gazou']==''){
$pro_gazou[]='';
}else{
$pro_gazou[]='<img src="../product/gazou/'.$rec['gazou'].'">';
}
$dbh=null;
}
}catch(Exception $e){
print'ただいま障害により大変ご迷惑をおかけしております';
exit();
}
?>
カートの中身<br/>
<br/>
<form method="post" action="kazu_change.php">
<?php
for($i=0;$i<$max;$i++){
?>
<?php print $pro_name[$i]; ?>
<?php print $pro_gazou[$i];?>
<?php print $pro_price[$i];?>円
<input type="text" name="kazu<?php print $i;?>" value="<?php print $kazu[$i];?>">
<?php print $kazu[$i];?>
<br/>
<?php
}
?>
<input type="hiden" name="max" value="<?php print $max;?>">
<input type="submit" value="数量変更"><br/>
<input type="button" onclick="history.back()" value="戻る">
</form>
</body>
数量の変更を行えるようにスクリプトを追加。受け取ったポストの中身に安全対策を施し、商品の数だけループを回し、受け取ったデータから商品の数量を割り当てている。これでinputのvalueの中身が変更されるようになる。
<?php
session_start();
session_regenerate_id(true);
require_once('../common/common.php');
$post=sanitize($_POST);
$max=$post['max'];
for($i=0,$i<$max;$i++;){
$kazu[]=$post['kazu'.$i];
}
$_SESSION['kazu']=$kazu;
header('Location:shop_cartlook.php');
exit();
?>
さらに合計金額を表示していく。
<?php print $pro_price[$i]*$kazu[$i];?>円をshop_cartlook.phpに追加する。
なぜか商品数の認識がうまくいかない。kazuの設定部分から見直していく