前回顧客情報入力を作成しました。
今回は、注文確定した後の処理をしていきます。
前回の顧客情報チェックファイル[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行目からのデータベースに保存する方法について
解説していきますが、その前にテーブルを作成します。
注文の内容と顧客情報をデータベースに
登録するために、データベースにテーブルを
作成します。
データベースにテーブルを作成
データベースについてよくわからないという方は、
以下の記事をお読みください。
[fshop]データベースに注文データを登録しますが、
そのテーブル名、カラム名を決めます。
2つのテーブルを作成します。
1つ目は注文した顧客データを保存するテーブルです。

データベース名:fshop
テーブル名:cust_order
各項目の項目名、データ型、長さは
項目 | カラム名 | データ型 | 長さ |
---|---|---|---|
注文ID | id | INT | 11 |
注文日時 | date | TIMESTAMP | 30 |
会員ID | mid | INT | 11 |
お名前 | name | VARCHAR | 20 |
メールアドレス | VARCHAR | 90 | |
郵便番号 | postal | VARCHAR | 7 |
住所 | address | VARCHAR | 50 |
電話番号 | tel | VARCHAR | 15 |
備考 | note | VARCHAR | 200 |


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

データベース名:fshop
テーブル名:order_goods
項目 | カラム名 | データ型 | 長さ |
---|---|---|---|
注文明細ID | did | INT | 11 |
注文ID | id | INT | 11 |
商品ID | mid | INT | 11 |
商品名 | name | VARCHAR | 30 |
価格 | price | INT | 11 |
数量 | num | INT | 11 |


に設定します。
これで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で会員登録」を基に
このショッピングカートにも追加してみようと思います。
コメント