ショッピングカート

 ようやく商品別削除機能を実装する事が出来ました。前作とはクッキーの保存方法が違います。今度は配列を使ってクッキーを保存するようにしました。(最初これが分からなかったのよ…)では、一応?完成版のスクリプトのソースコードをご説明したいと思います。

 今回のクッキーの配列処理は、Perlに比べて非常に処理コードが簡単でした。同じ事をするのにも、PHPだとこんなにも手間が省けるものかと驚かされます(^^ゞ

<?php PHP開始の合図。
//==================初期設定====================
$title = 'ショッピングカート';
$kago_img = './kago.gif'; //ショッピングカート画像。適当に!
$bg_color = '#fffbf0';
$back_img = ''; //バック画像。適当に!
$goback = './*****.htm'; //商品ページへのパス
$subject = '「PHPの小部屋」サンプルスクリプトより';
$to = '*****@***.**.jp'; //メール送信先
$taskrate = 5; //消費税率(%)。取らない時は0に設定する。
従来と同じ。
//=====================クッキー書き込み関数==========================
function CookieSet(){
 global $Cookie,$goods,$price,$amount,$PHP_SELF;
 
$g_num = time(); //クッキー識別番号を現在の秒数からゲット
 $value = "$goods,$price,$amount";
 setcookie("Cookie[$g_num]", $value); //ブラウザを閉じるとリセット
 echo "<META HTTP-EQUIV=refresh content=0;URL=$PHP_SELF>";
}
[変更点]クッキー配列の識別番号の取得に、アクセス時の秒数を使うようにしました。

又、ブラウザを閉じた時にクッキーがリセットされるよう、クッキーの
有効期限を設定していません。ページの更新にはリフレッシュ機能を使っています。
//==================HTMLヘッダー出力関数====================
function HtmlHead(){
 global $title,$bg_color,$back_img,$kago_img,$goback;
 print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n";
 print "<BODY BGCOLOR=$bg_color BACKGROUND=$back_img LINK='red' VLINK='red'>\n";
 print "<CENTER><TABLE BORDER=0 CELLSPACING=1 WIDTH=84%>\n";
 print "<TR><TD WIDTH=25%><P ALIGN=RIGHT><IMG SRC=$kago_img WIDTH=70 HEIGHT=49 ALIGN=BOTTOM BORDER=0></TD>\n";
 print "<TD WIDTH=50% BGCOLOR=#FFCCFF><P ALIGN=CENTER><FONT SIZE=6>$title</FONT></TD>\n";
 print "<TD WIDTH=25%><IMG SRC=$kago_img WIDTH=70 HEIGHT=49 ALIGN=BOTTOM BORDER=0></TD></TR>\n";
 print "</TABLE></P>\n";
 print "<P>右のリンクで商品ページにお戻り下さい。<A HREF=$goback>商品ページへ</A></P></CENTER>\n";
}
従来と同じ。サンプルでは、ここにKOMONETへのリンクを埋め込んでいます。悪しからず_(._.)_
//==============商品一覧表示関数===================
function CookieView(){
 global $Cookie,$taskrate,$PHP_SELF;
 if(isset($Cookie)){
  print "<CENTER><TABLE BORDER=1>\n";
  print "<TR><TH BGCOLOR=#ccffff>商品名</TH><TH BGCOLOR=#ccffff>価格</TH><TH BGCOLOR=#ccffff>数量</TH><TH BGCOLOR=#ccffff>小計</TH><TH BGCOLOR=#ccffff>削除</TH></TR>\n";
  while(list($g_num, $value) = each($Cookie)){
   list($dgoods,$dprice,$damount) = split(",", $value);
   
$dprice3 = number_format($dprice);
   $damount3 = number_format($damount);

   $shoukei = (integer)$dprice * (integer)$damount;
   
$shoukei3 = number_format($shoukei);
   $goukei += $shoukei;
   print "<TR><TD>$dgoods</TD><TD>$dprice
3</TD><TD>$damount3</TD><TD>$shoukei3</TD>\n";
   print "<TD><FORM ACTION=$PHP_SELF METHOD=POST>\n";
   print "<INPUT TYPE=HIDDEN NAME=action VALUE=remove>\n";
   print "<INPUT TYPE=HIDDEN NAME=g_num VALUE=$g_num>\n";
   print "<INPUT TYPE=SUBMIT VALUE=削除></TD></TR></FORM>\n";
  }
★int isset ( mixed var )関数・・・引数var が存在すればtrue、そうでなければfalseを返します。

クッキーの格納に
配列を使うようにしたので、当然呼び出し方も違います。

★array each ( array array )関数・・・配列array から、次のキーと値のペアを返し、配列の内部ポインタを進めます。

商品別削除のフォームデータには、配列の
$g_numの値を持たせています。これで該当の商品データをクッキーから削除します。

追加・・・価格表示を見やすくする為、
number_format()関数を使って三桁区切りにしました。
  $goukei3 = number_format($goukei);
print "<TH BGCOLOR=#ccffff COLSPAN=
3>合計</TH><TH BGCOLOR=#ccffff COLSPAN=2>$goukei3</TH></TR>\n";
  print "</TABLE><BR>\n";
  if($taskrate > 0){
   $task = (integer)$goukei * (integer)$taskrate / 100;
   
$task3 = number_format($task);
   $sougoukei = (integer)$goukei + (integer)$task;
   
$sougoukei3 = number_format($sougoukei);
   print "<CENTER><TABLE BORDER=1>\n";
   print "<TR><TH BGCOLOR=#ffffee>消費税</TH><TH BGCOLOR=#ffffee>総合計</TH></TR>\n";
   print "<TR><TD>$task
3</TD><TD>$sougoukei3</TD></TR></TABLE><BR>\n";
  }
  print "ご注文がお決まりになりましたら、下の申込欄に必要事項をご記入の上、発注ボタンを押して下さい。\n";
  print "<FORM ACTION=$PHP_SELF METHOD=POST>\n";
  print "<INPUT TYPE=HIDDEN NAME=action VALUE=send>\n";
  if($taskrate > 0){
   print "<INPUT TYPE=HIDDEN NAME=sum VALUE=$sougoukei>\n";
  } else {
   print "<INPUT TYPE=HIDDEN NAME=sum VALUE=$goukei>\n";
  }
  print "<TABLE BORDER=1>\n";
  print "<TR><TD>お名前</TD><TD><INPUT TYPE=TEXT NAME=name SIZE=20> <FONT COLOR='red' SIZE=2>*必須!</FONT></TD>\n";
  print "<TR><TD>郵便番号</TD><TD><INPUT TYPE=TEXT NAME=pcode SIZE=20></FONT></TD>\n";
  print "<TR><TD>ご住所</TD><TD><INPUT TYPE=TEXT NAME=addr SIZE=50> <FONT COLOR='red' SIZE=2>*必須!</FONT></TD>\n";
  print "<TR><TD>電話番号</TD><TD><INPUT TYPE=TEXT NAME=tel SIZE=20></TD>\n";
  print "<TR><TD>E-mail</TD><TD><INPUT TYPE=TEXT NAME=email SIZE=30> <FONT COLOR='red' SIZE=2>*必須!</FONT></TD>\n";
  print "<TR><TD>一言どうぞ</TD><TD><TEXTAREA NAME=comment ROWS=5 COLS=50></TEXTAREA></TD></TABLE><BR>\n";
  print "<INPUT TYPE=SUBMIT VALUE=発注する> <INPUT TYPE=RESET VALUE=書き直す></FORM>\n";
  print "</CENTER></BODY></HTML>\n";
 } else {
  print "<P ALIGN=CENTER><B>現在選択された商品はございません。</B></P><BODY></HTML>\n";
 }
}
商品一覧の表組みが変わったので、合計金額の表示部分の仕様を変更しました。

後は従来と同じ。

追加・・・価格表示を見やすくする為、
number_format()関数を使って三桁区切りにしました。
//==================商品削除関数===================
function Remove(){
 global $g_num,$PHP_SELF;
 setcookie("Cookie[$g_num]"); //クッキー削除
 echo "<META HTTP-EQUIV=refresh content=0;URL=$PHP_SELF>";
}
ここが今回のメインの、商品別削除functionです。フォームデータから受け取った変数$g_numの値を元に、該当商品のクッキー情報を削除しています。削除後の更新はリフレッシュ機能を使っています。
//==================クッキー全削除関数===================
function Delete(){
 global $Cookie,$PHP_SELF;
 while(list($g_num, $value) = each($Cookie)){
  setcookie("Cookie[$g_num]"); //クッキーを全て削除
 }
 echo "<META HTTP-EQUIV=refresh content=0;URL=$PHP_SELF>";
}
クッキーを全て削除する為の関数Delete( )を作りました。ループ処理を使って、全てのクッキーを削除しています。削除後の更新はリフレッシュ機能を使っています。
//=======================メール送信処理関数===========================
function SendMail(){
 global $to,$subject,$taskrate,
$Cookie,$sum,$name,$pcode,$addr,$tel,$email,$comment,$PHP_SELF;
 if(($name != "") && ($addr != "") && ($email != "")){
  $from = $email;
  $header = "From: $from";
今回はクッキーの名前を$Cookieに変更しています。(前回は$valueでした。)メール送信後、「クッキー削除」ボタンを表示するようにしたので、グローバル変数に$PHP_SELFを追加しました。
  while(list($g_num, $value) = each($Cookie)){
   list($dgoods,$dprice,$damount) = split(",", $value);
   $msg .= "ご注文 = $dgoods ( $dprice )× $damount\n";
  }
今回はクッキーの書き込みに配列を使っているので、読み出し方法も変更しました。
  if($taskrate != ""){ $msg .= "消費税率 = $taskrate %\n"; }
  $msg .= "合計 = $sum\n";
  $msg .= "お名前 = $name\n";
  if($pcode != ""){ $msg .= "郵便番号 = $pcode\n"; }
  $msg .= "ご住所 = $addr\n";
  if($tel != ""){ $msg .= "電話番号 = $tel\n"; }
  $msg .= "E-mail = $email\n";
  if($comment != ""){ $msg .= "一言どうぞ = $comment\n"; }
  if(mb_send_mail($to, $subject, $msg, $header)){
   HtmlHead();
従来と同じ。
   print "<P ALIGN=CENTER><B>発注メールは無事送信されました(^o^)丿有難うございました。。</B></P>\n";
   print "<P ALIGN=CENTER><FONT COLOR='blue'>クッキーを全て削除したい場合は、下の「クッキー削除」ボタンを押して下さい。</FONT></P>\n";
   print "<P ALIGN=CENTER><FORM ACTION=$PHP_SELF METHOD=POST>\n";
   print "<INPUT TYPE=HIDDEN NAME=action VALUE=delete>\n";
   print "<INPUT TYPE=SUBMIT VALUE=クッキー削除></FORM></P>\n";
   print "</BODY></HTML>\n";
メール送信後、クッキーを全て削除できるよう、送信ボタンを作りました。Delete( )関数を呼び出す事によって、クッキーを全て削除出来ます。尚、ブラウザを閉じてしまえば、同様にクッキーは全て削除されます。
  } else {
   HtmlHead();
   print "<P ALIGN=CENTER><B>メールの送信に失敗しました(>_<)もう一度やり直して下さい。</B></P>\n";
   CookieView();
  }
 } else {
  HtmlHead();
  print "<P ALIGN=CENTER><B>必須事項が記入されていません。ブラウザの「戻る」で前のページに戻ってやり直して下さい。</B></P></BODY></HTML>\n";
 }
}
従来と同じ。
//=======================メイン処理==========================
if($action == "regist"){ CookieSet(); }
elseif($action == "
remove"){ Remove(); }
elseif($action == "send"){ SendMail(); }
elseif($action == "delete"){ Delete(); }
else { HtmlHead(); CookieView(); }
商品別クッキー削除の条件処理が変更しました。

新たに、クッキーを全部削除する関数
Delete( )も作りました。
?> PHP終了の合図。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME