PHPでショッピングカートを!【9.顧客情報入力完了】

PHP

前回顧客情報入力を作成しました。
今回は、注文確定した後の処理をしていきます。

前回の顧客情報チェックファイル[inputinfo_chk.php]
受けて注文の最終処理を行います。

注文が完了した旨の表示自動返信メール作成、
注文データをデータベースに登録等をやっていきます。

顧客情報入力完了

ファイル名:inputinfo_end.php

<記述例>

<?php
session_start();
session_regenerate_id(true);
?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>顧客情報入力完了</title>
    <style type="text/css">
<!--
.txtbox{display: inline-block;margin: 10px;}
h4{background-color:mediumaquamarine;padding: 3px 10px;}
table {margin: 10px auto;padding: 10px;border-collapse: collapse;border: 2px solid seagreen;}
table tr:nth-child(even) {background: mintcream;}
table tr:nth-child(odd) {background: honeydew;}
table tr th,td {border: 1px solid seagreen;padding: 5px 10px; text-align: left;}
table tr th {background-color:mediumaquamarine;}
table .right{text-align: right;}
.btnbox{text-align: center;}
.btn1{color: honeydew;font-size: 16px;background: gray;border-radius: 30px 0 0 30px;padding: 10px 24px;margin: 5px 10px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section class="txtbox">

<?php

require_once('../com_func.php');

$post=sanitize($_POST);

$cname=$post['cname'];
$email=$post['email'];
$postal=$post['postal'];
$address=$post['address'];
$tel=$post['tel'];
$note=$post['note'];

print $cname.' 様<br>';
print 'ご注文ありがとうございました。<br>';
print $email.' 宛に自動返信メールを送りましたのでご確認ください。<br>';
print 'ご注文いただいた商品は以下の住所に発送させていただきます。<br><br>';
print '入力された内容は以下の通りです。<br>';
print '<h4>お客様ご入力内容</h4>';
print '<table><tr><th>お名前</th>';
print '<td>'.$cname.'</td></tr>';
print '<tr><th>メールアドレス</th>';
print '<td>'.$email.'</td></tr>';
print '<tr><th>郵便番号</th>';
print '<td>'.substr($postal,0,3).'-'.substr($postal,3,4);
print '<tr><th>住所</th>';
print '<td>'.$address.'</td></tr>';
print '<tr><th>電話番号</th>';
print '<td>'.$tel.'</td></tr>';
print '<tr><th>備 考</th><td>'.nl2br($note).'</td></tr>';
$date_time=new DateTime();
$date_time_disp=$date_time->format("Y-m-d H:i");
print '<tr><th>注文日時</th><td>'.$date_time_disp.'</td></tr>';
print '</table>';

$replymail='';
$replymail.=$cname." 様\n\nこのたびはご注文ありがとうございました。\n";
$replymail.="\n";
$replymail.="入力された内容は以下の通りです。\n";
$replymail.="\n";
$replymail.="お名前:".$cname."\n";
$replymail.="メールアドレス:".$email."\n";
$replymail.="郵便番号:".$postal."\n";
$replymail.="住所:".$address."\n";
$replymail.="電話番号:".$tel."\n";
$replymail.="備考:".$note."\n";
$replymail.="日時:".$date_time_disp."\n";
$replymail.="\n";
$replymail.="ご注文商品\n";
$replymail.="**************************\n";

$id=$_SESSION['id'];
$name=$_SESSION['name'];
$price=$_SESSION['price'];
$num=$_SESSION['num'];
$max=count($id);
print '<h4>ご注文商品内容</h4>';
print '<table><tr>';
print '<td>No.</td><td>商品名</td><td>価格</td>';
print '<td>数量</td><td>小計</td></tr>';
$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 class="right">'.$num[$i].'</td>';
  $sub=$price[$i] * $num[$i];
  $sum += $sub;
  print '<td class="right">'.number_format($sub).'</td></tr>';
  $replymail.='No.'.$i1."\n";
  $replymail.='商品名:'.$name[$i]."\n";
  $replymail.='価格:'.number_format($price[$i])." 円\n";
  $replymail.='数量:'.$num[$i]."\n";
  $replymail.='小計:'.number_format($sub)." 円\n\n";
}
print '<tr><td colspan="4" class="right">合 計</td>';
print '<td class="right">'.number_format($sum).'</td></tr>';
print '<tr><td colspan="4" class="right">消費税</td>';
print '<td class="right">'.number_format($sum * 0.1).'</td></tr>';
print '<tr><td colspan="4" class="right">合計金額</td>';
print '<td class="right">'.number_format($sum * 1.1).'</td></tr>';
print '</table>';
$replymail.="合計:".number_format($sum)." 円\n";
$replymail.="消費税:".number_format($sum * 0.1)." 円\n";
$replymail.="税込金額:".number_format($sum * 1.1)." 円\n\n";
$replymail.="送料は別途かかります。\n";
$replymail.="**************************\n";
$replymail.="\n";
$replymail.="--------------------------\n";
$replymail.=" ネットショップ〇〇〇\n";
$replymail.="\n";
$replymail.="住所:〇〇〇〇〇〇〇〇〇〇〇〇〇\n";
$replymail.="電話:〇〇-〇〇〇-〇〇〇〇\n";
$replymail.="メール:〇〇@〇〇〇〇〇.com\n";
$replymail.="--------------------------\n";
print '<br>';

$title='ご注文ありがとうございます。';
$header='From:〇〇@〇〇〇〇〇.com';
$mail1=html_entity_decode($replymail,ENT_QUOTES,'UTF-8');
mb_language('Japanese');
mb_internal_encoding('UTF-8');
//mb_send_mail($email,$title,$mail1,$header);

$title='お客様からおご注文がありました。';
$header='From:'.$email;
$mail1=html_entity_decode($replymail,ENT_QUOTES,'UTF-8');
mb_language('Japanese');
mb_internal_encoding('UTF-8');
//mb_send_mail('〇〇@〇〇〇〇〇.com',$title,$mail1,$header);

try
{
$dbh=dbconnect();
$dbh->query('SET NAMES utf8');

$sql='LOCK TABLES cust_order,order_goods WRITE';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$lastmid=0;
$sql='INSERT INTO cust_order(mid,name,email,postal,address,tel,note) VALUES(?,?,?,?,?,?,?)';
$stmt=$dbh->prepare($sql);
$data[]=$lastmid;
$data[]=$cname;
$data[]=$email;
$data[]=$postal;
$data[]=$address;
$data[]=$tel;
$data[]=$note;
$stmt->execute($data);

$sql='SELECT LAST_INSERT_ID()';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$lastid=$rec['LAST_INSERT_ID()'];

for($i=0; $i<$max; $i++)
{
  $sql='INSERT INTO order_goods(id,mid,name,price,num) VALUES(?,?,?,?,?)';
  $stmt=$dbh->prepare($sql);
  $data=array();
  $data[]=$lastid;
  $data[]=$id[$i];
  $data[]=$name[$i];
  $data[]=$price[$i];
  $data[]=$num[$i];
  $stmt->execute($data);
}

$sql='UNLOCK TABLES';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$dbh=null;
}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}
unset($_SESSION['id']);
unset($_SESSION['name']);
unset($_SESSION['price']);
unset($_SESSION['num']);

?>
<br>
<button class="btn1" onclick="location.href='shop_top.php'">トップページへ</button>
      </section>
    </main>
  </body>
</html>

1~2行目:セッションスタート。
31行目:関数読み込み。
33行目:フォームから送られたデータをサニタイジング。
35~40行目:サニタイジングしたデータを変数に代入。
58行目:変数内の改行を表示させるために[nl2br]を使用。

59行目:今の日時[new DateTime()]を変数に代入。
60行目:日付のフォーマットに変換して変数に代入。
例:format(“Y-m-d H:i”)
表示:2020-04-16 17:41

64~78行目:[$replymail]に自動返信メールの内容を代入。
メール本文の改行には[\n]を使います。
[.=]を使って変数に追加で付け加えています。

80~83行目:セッションに保存されたデータを代入。

132・139行目:メールを送信する命令です。
例:mb_send_mail(送信先アドレス,タイトル,本文,ヘッダー)
ここでは、間違って送信されないように[//]でコメントアウトしています。

141~193行目:データベースに注文データを保存します。
194~197行目:セッションに保存されたデータを破棄します。

データベースに注文データを保存

141行目からのデータベースに保存する方法について
解説していきますが、その前にテーブルを作成します。

注文の内容と顧客情報をデータベースに
登録するために、データベースにテーブルを
作成します。

データベースにテーブルを作成

データベースについてよくわからないという方は、
以下の記事をお読みください。

参考記事紹介
PHPで会員登録にチャレンジ!【2.データベース作成】
PHPで会員登録にチャレンジ!【4.データベース接続】

[fshop]データベースに注文データを登録しますが、
そのテーブル名、カラム名を決めます。

2つのテーブルを作成します。

1つ目は注文した顧客データを保存するテーブルです。

データベース名:fshop
テーブル名:cust_order

各項目の項目名、データ型、長さは

項目カラム名データ型長さ
注文IDidINT11
注文日時dateTIMESTAMP30
会員IDmidINT11
お名前nameVARCHAR20
メールアドレスemailVARCHAR90
郵便番号postalVARCHAR7
住所addressVARCHAR50
電話番号telVARCHAR15
備考noteVARCHAR200

2つ目は注文商品のデータを保存するテーブルです。

データベース名:fshop
テーブル名:order_goods

項目カラム名データ型長さ
注文明細IDdidINT11
注文IDidINT11
商品IDmidINT11
商品名nameVARCHAR30
価格priceINT11
数量numINT11

に設定します。

これで2つのテーブルが作成されました。

データベース関連部分の解説

143行目:[fshop]データベースに接続。
146行目:[LOCK TABLES]でテーブルをロックします。
例:LOCK TABLES テーブル名1,テーブル名2 WRITE
テーブル名1とテーブル名2との追加書き込みをロックします。
この命令で重複書き込みを防止し、
この後のテーブル書き込みに備えます。

150行目:会員IDを0にします。
151・170行目:INSERT INTO で追加書き込みをします。

162行目SELECT LAST_INSERT_ID()で注文IDを取得します。
SELECT LAST_INSERT_ID()というSQL文で、
A_I(自動採番)の主キーを設定した id(注文ID)の
最後に追加された取得します。
166行目:注文IDを[$lastid]に代入します。

181行目:[UNLOCK TABLES]でロックを解除します。
185行目:データベース切断します。

これでおおまかな解説は終わりました。

動作確認

動作確認のため、[item_list.php]から
商品を選び、顧客情報入力をし、[注文確定]ボタンを押します。
(ここでは例として長崎市役所を使わせていただきました。)

注文完了した後、このように表示されます。

お客様と販売者に送られる自動返信メールです。

一応 phpMyAdmin で確認してみました。

ちゃんと登録されていましたね。

一応これでショッピングカートの作成は
一通り終えました。

ダウンロード

ここまでのファイルをちょっと整理してみます。

[fshop]フォルダに[shop]フォルダと[com_func.php]があり、
[shop]フォルダに[item_list.php]とカート関連ファイルがあります。

これでは構成がおかしいので再編成します。

[fshop]フォルダに[cart]フォルダを作成し
カート関連ファイルを入れ、[item_list.php]
[com_func.php][fshop]フォルダに入れます。

一連のカート関連ファイルをダウンロード
出来るようにしました。

注意点として、この中のinputinfo_end.phpファイル
をそのまま使うとメール送信がコメントアウト
した状態なので送信できません。

自動返信メールの動作確認するためには
139行目の受信メールアドレスを設定して
132・139行目行頭の[//]を削除してください。

ほかの商品管理関連ファイルは
以下の記事の最後でダウンロードできます。

記 事 紹 介
PHPでショッピングカートを!【4.準備:共通部分関数化】

何とか終えました、よかったよかった。

まあ、これで終わってもいいのですが、
これまでやってきてもう少しこのショッピングカートを
充実させたいなと思っています。

まず次回は、以前の記事「PHPで会員登録」を基に
このショッピングカートにも追加してみようと思います。

コメント

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