PHPで簡単ショッピングカート!【3.カート本体】

PHP

前回、PHPの概要について再説明しました。

前回の記事を読んでいただければ、
今から説明するショッピングカートの内容が
わかりやすくなっていると思います。

では、ショッピングカート本体です。

ショッピングカート本体

ファイル名:item_cart.php

<記述例>

<?php
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="../fshopstyle.css">
    <title>さかなショップショッピングカート</title>
  </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;
  }
$max=count($id);
}
else
{
if(isset($_SESSION['id'])==false){
  $max=0;
}else{
  $id=$_SESSION['id'];
  $name=$_SESSION['name'];
  $price=$_SESSION['price'];
  $num=$_SESSION['num'];
  $max=count($id);
}
}
print '<h3>さかなショップショッピングカート</h3>';
print '<div style="text-align: center;">';
print '<ul class="cartflow">';
print '<li class="choice">カート</li>';
print '<li>情報入力</li>';
print '<li>入力確認</li>';
print '<li>注文確定</li></ul></div>';
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>';
if($max==0)
{
  print '<tr><td colspan="6">カートに商品が入っていません。</td></tr></table>';
  print '<a href="../items/item_list.html">商品一覧へ戻る</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="submit" name="del'.$i.'" value="削除" onClick="return confirm('."'削除してよろしいですか?');".'"></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 class="btn3" type="submit" name="nchk" value="数量変更">';
print '<input class="btnr" type="submit" name="cclear" value="カートクリア" onClick="return confirm('."'カートクリアしますか?');".'">';
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>

<表示例>

1・3・14・109行目:PHP記述部分
PHPを記述する部分は、
<?php」 と 「?>」の間です。
このファイルでは、2箇所(1~3・14~109)に記述しています。

2行目:セッションスタート
session_start 関数を使ってセッションをスタートさせます。
既にスタートしていたらそのセッションを再開します。

後で述べますが、$_SESSION(セッション)
使用するためにスタートさせています。

15行目require_once()を使いファイルを読み込んでいます。
ここで読み込むファイルは、
前回の記事で説明した[com_func.php]です。

16行目:if文を使い分岐しています。
ここでは、isset($_POST[‘id’])
真(true)であれば、17~49行目までの処理を行い、
偽(false)であれば、51~61行目までの処理を行う
ということです。

この条件にあるisset関数は、その変数が存在し、
値があるかどうか、空(null)でないかをチェックします。

ここでの条件は、$_POST[‘id’]が存在し、空でなければ
真(true)となります。

18行目:15行目で読み込んだファイルにある関数[sanitize]
    で受信した[$_POST]を変換し、$post変数へ代入
19~22行目:受信したデータをそれぞれの変数に代入
23行目:[$flag1]に偽(false)を代入
24行目:$_SESSION[‘id’] が真(true)なら25~36行目の処理を行う
26~29行目:セッションに保存されたデータを変数に代入

30行目in_array関数で重複チェックし
    重複していれば31~35行目の処理を行う
同じ商品がカートに入ったか確認(重複チェック)するために、
in_array関数を使います。
例:in_array(値1,配列1)
配列1の中に指定した値1があるかどうかを探します。

32・33行目:alertを使ってアラート(警告)を表示
alertは、JavaScriptです。
書式例:alert(‘アラートメッセージ’);
34行目:[$flag1]に真(true)を代入

ここで使われている $flag1 は、重複チェック
重複していた場合に真(true)、
重複していない場合は偽(false)を代入しています。

37行目:$flag1が偽(false)の場合つまり
    重複していなければ38~47行目の処理を行う
39~42行目:変数に代入
43~46行目:セッションに代入(保存)
書式例:$_SESSION[‘キー’]=値;

48行目:$max変数に$idのデータ数を代入
countは変数の要素の数を数える関数です。
例:count(変数)

52行目:$_SESSION[‘id’] が偽(false)なら53行目の処理を行い、
    違っていたら55~59行目の処理を行う
53行目:$maxに0を代入
55~58行目:変数にセッションの値を代入
59行目:$max変数に$idのデータ数を代入
62行目:ショッピングカートのタイトル
63~68行目:カートの流れを表示
69行目:formで[change_num.php]へ送信
70~72行目:カートの見出し
73~78行目:[$max]が0の時カートが空である旨表示
78行目:exit()で強制的に終了させる
79行目:小計($sub)と合計($sum)とを初期化(0を代入)
80行目for文で81~90行目の処理を繰り返し

for文は、繰り返し命令です。
例:for(条件){処理}
条件が真(true)の間処理を続けます。

$i=0:$i の初期値を0とする。
$i<$max:$max より $i が小さい間。
$i++:処理を行うごとに $i を1増やします。
という意味です。

$idの配列内のデータ数を$maxに代入し
その数だけfor文でループを組んで表示させています。
82行目で $i1 に $i+1 を代入し、No.の値を
1から表示させるようにしています。

84・88・92・95・99行目number_formatで3桁のカンマ区切りにする

85行目:inputで数量を入力(修正)できるようにする
formでデータを送るときnameで識別していますが、
数量の名前がすべてnumだと区別が付きません。

それで、商品ごとにnameをnum1、num2、num3、と
変更させると解決します。

PHPでは、
name=”num’.$i.'”
HTMLでは、
name=”num<?php print $i; ?>”
と記述します。

89行目でもinputで個別削除のどのボタンを押したか
区別するために数量の時と同じくnameを
del1、del2、del3、としています。

86行目:価格($price) x 数量($num) を 小計($sub)に代入
87行目:小計($sub)を合計($sum)に代入演算子[+=]で加算
[$sum += $sub;] は [$sum = $sum + $sub;]と同じ

89・103行目:confirmを使って確認画面([OK][キャンセル])を表示
confirmは、確認ダイアログを表示するJavaScriptです。
書式例:confirm(‘メッセージ’);
89行目では個別削除の確認、103行目ではカートクリアの確認です。

91~93行目:合計を表示させています。
94~96行目:消費税(合計x0.1)を表示させています。
97~99行目:合計金額(合計x1.1)を表示させています。
100行目:type=”hidden”で表示させずに[$max]を送信
102行目:数量変更ボタンの表示
106・107行目:商品一覧へ戻るとご購入手続きへボタンの表示
108行目:formを終わる

24・26~29・43~46・52・55~58行目
使われている変数[$_SESSION]は、
ほかのページに移動しても配列変数の情報を
保持し続けます。

$_SESSION(セッション)とは

PHPのファイル間を移動してもデータが残る変数として
$_SESSION(セッション)があります。
これはスーパーグローバル変数(定義済み変数)です。

CSSファイルの追加分

ファイル名:fshopstyle.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;
}
.btn3{
  color: darkgreen;
  font-size: 16px;
  background: honeydew;
  border-radius: 30px;
  padding: 6px 12px;
  margin: 5px;
}
.btnr{
  color: crimson;
  font-size: 16px;
  background: lavenderblush;
  border-radius: 30px;
  border: 3px solid crimson;
  padding: 6px 12px;
  font-weight: bold;
  margin: 5px;
}
ul.cartflow {
  padding:10px;
  background:palegoldenrod;
  border:1px solid silver;
  margin: 10px auto;
  display:inline-block;
}
ul.cartflow li{
  background: darkgray;
  border-radius: 0 30% 30% 0 / 0 50% 50% 0;
  padding: 5px 15px 5px 10px;
  width:80px;
  display:inline-block;
  text-align: center;
  margin: 0;
}
ul li.choice{
  background: tomato;
  border:3px solid maroon;
  font-weight: bold;
}

今回は、[item_cart.php][fshopstyle.css]とを
説明しました。

結構長くなりましたので、
[change_num.php]は次回にします。

コメント

タイトルとURLをコピーしました