前回、商品一覧と管理者一覧をcsvファイルでダウンロードしました。
同じように、登録した会員一覧と注文一覧も
表示と共にダウンロード出来たらいいですよね。
やってみましょう。
商品一覧[goods_list.php]を修正するだけで
簡単にできます。
登録会員一覧
ファイル名:member_list.php
<記述例>
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['alogin'])==false)
{
print '管理者ログインしていません。<br>';
print '<a href="admin_login.html">管理者ログイン画面へ</a>';
exit();
}
else
{
$name=$_SESSION['name'];
print '管理者:'.$name.' ログイン中<br><br>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>登録会員一覧</title>
<style type="text/css">
<!--
table {margin: 10px;padding: 10px;}
table tr:nth-child(even) {background: cornsilk;}
table tr:nth-child(odd) {background: wheat;}
table tr th,td {border-bottom: 1px solid tan; padding: 2px 5px; text-align: center;}
table .right{text-align: right;}
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid darkslategray;padding: 6px 10px; margin-left: 120px;}
-->
</style>
</head>
<body>
<main>
<section>
<?php
try
{
require_once('../com_func.php');
$dbh=dbconnect();
$dbh->query('SET NAMES utf8');
$sql='SELECT * FROM cust_member';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh=null;
print '<h3>登録会員一覧</h3>';
print '<table><tr>';
print '<td>会員ID</td><td>会員名</td><td>登録日時</td><td>メールアドレス</td><td>郵便番号</td><td>住所</td><td>電話番号</td></tr>';
$csv='会員ID,会員名,登録日時,メールアドレス,郵便番号,住所,電話番号'."\n";
while(true)
{
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false){break;}
$id=$rec['id'];
$mname=$rec['name'];
$date=$rec['date'];
$email=$rec['email'];
$postal=$rec['postal'];
$address=$rec['address'];
$tel=$rec['tel'];
$postal2=substr($postal,0,3).'-'.substr($postal,3,4);
print '<tr><td class="right">'.$id.'</td>';
print '<td>'.$mname.'</td><td>'.$date.'</td>';
print '<td>'.$email.'</td><td>'.$postal2.'</td>';
print '<td>'.$address.'</td><td>'.$tel.'</td>';
$csv.=$id.','.$mname.','.$date.','.$email.','.$postal2.','.$address.','.$tel."\n";
}
print '</tr></table>';
$file=fopen('./memberlist.csv','w');
$csv=mb_convert_encoding($csv,'SJIS','UTF-8');
fputs($file,$csv);
fclose($file);
}
catch(Exception $e)
{
print ' ただいま障害により大変ご迷惑をおかけしております。';
exit();
}
?>
<a href="memberlist.csv">登録会員ダウンロード</a><br><button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>
</section>
</main>
</body>
</html>
2~3行目:セッションスタート
4~14行目:管理者ログイン処理
38行目:関数読み込み
39~46行目:データベース接続切断
50行目:会員一覧の見出しを表示
51行目:会員一覧の見出しを[$csv]に代入
52行目:真(true)の間繰り返す
55行目:[$rec]が偽(false)つまり空になったら終わる
56~62行目:データベースのデータを変数に代入
63行目:郵便番号の間に[-]を挿入
64~67行目:会員情報を表示
68行目:会員情報を[$csv]に代入
71~74行目:ファイルアクセス
前回の商品一覧ダウンロードで説明しているので
わかると思います。
商品管理画面修正
動作確認の前に、商品管理画面を修正し
会員一覧と注文一覧へのリンクを追加しましょう。
追加箇所のみ記述します。
ファイル名:goods_ctl.php
<h3 class="top">注 文 管 理</h3>
<ul>
<li><button onclick="location.href='member_list.php'">登録会員一覧</button></li>
<li><button onclick="location.href='order_list.php'">注文一覧</button></li>
</ul>
<表示例>

会員一覧の動作確認
それでは、[goods_ctl.php]から[登録会員一覧]を
クリックし、[登録会員ダウンロード]をクリックします。

保存するファイルの保存先を選択し保存すると
csvファイルがダウンロードされます。

無事ダウンロードできました。
注文一覧
ファイル名:order_list.php
<記述例>
<?php
session_start();
session_regenerate_id(true);
if(isset($_SESSION['alogin'])==false)
{
print '管理者ログインしていません。<br>';
print '<a href="admin_login.html">管理者ログイン画面へ</a>';
exit();
}
else
{
$name=$_SESSION['name'];
print '管理者:'.$name.' ログイン中<br><br>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>注文一覧</title>
<style type="text/css">
<!--
table {margin: 10px;padding: 10px;}
table tr:nth-child(even) {background: cornsilk;}
table tr:nth-child(odd) {background: wheat;}
table tr th,td {border-bottom: 1px solid tan; padding: 2px 5px; text-align: center;}
table .right{text-align: right;}
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid darkslategray;padding: 6px 10px; margin-left: 120px;}
-->
</style>
</head>
<body>
<main>
<section>
<?php
try
{
require_once('../com_func.php');
$dbh=dbconnect();
$dbh->query('SET NAMES utf8');
$sql='
SELECT
cust_order.id,cust_order.date,cust_order.mid,
cust_order.name AS cname,
cust_order.email,cust_order.postal,cust_order.address,
cust_order.tel,cust_order.note,
order_goods.mid AS gid,
order_goods.name AS gname,
order_goods.price,order_goods.num
FROM cust_order,order_goods
WHERE cust_order.id=order_goods.id';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh=null;
print '<h3>注文一覧</h3>';
print '<table><tr>';
print '<td>注文ID</td><td>注文日時</td><td>会員ID</td><td>お名前</td>';
print '<td>メールアドレス</td><td>郵便番号</td><td>住所</td><td>電話番号</td>';
print '<td>備考</td><td>商品ID</td><td>商品名</td><td>価格</td><td>数量</td></tr>';
$csv='注文ID,注文日時,会員ID,お名前,メールアドレス,郵便番号,住所,電話番号,備考,商品ID,商品名,価格,数量'."\n";
while(true)
{
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false){break;}
$id=$rec['id'];
$date=$rec['date'];
$mid=$rec['mid'];
$cname=$rec['cname'];
$email=$rec['email'];
$postal=$rec['postal'];
$address=$rec['address'];
$tel=$rec['tel'];
$note=$rec['note'];
$gid=$rec['gid'];
$gname=$rec['gname'];
$price=$rec['price'];
$num=$rec['num'];
$postal2=substr($postal,0,3).'-'.substr($postal,3,4);
print '<tr><td class="right">'.$id.'</td><td>'.$date.'</td>';
print '<td class="right">'.$mid.'</td><td>'.$cname.'</td>';
print '<td>'.$email.'</td><td>'.$postal2.'</td>';
print '<td>'.$address.'</td><td>'.$tel.'</td><td>'.$note.'</td>';
print '<td>'.$gid.'</td><td>'.$gname.'</td><td>'.$price.'</td>';
print '<td>'.$num.'</td></tr>';
$csv.=$id.','.$date.','.$mid.','.$cname.','.$email.','.$postal2.','.$address.','.$tel.','.$note.','.$gid.','.$gname.','.$price.','.$num."\n";
}
print '</tr></table>';
$file=fopen('./orderlist.csv','w');
$csv=mb_convert_encoding($csv,'SJIS','UTF-8');
fputs($file,$csv);
fclose($file);
}
catch(Exception $e)
{
print ' ただいま障害により大変ご迷惑をおかけしております。';
exit();
}
?>
<a href="orderlist.csv">注文ダウンロード</a><br><button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>
</section>
</main>
</body>
</html>
45~55行目:SQL文
このSQL文は今までとちょっと違います。
[SELECT]の後の項目(列)指定がテーブル名も記述しています。
それは[FROM]の後テーブルを複数指定しているからです。
48・51・52行目の[AS]は項目名を設定しています。
55行目:[cust_order]の[id]と[order_goods]の[id]が同じ時
つまり、注文と注文商品の注文IDが同じものを探すということです。
注文一覧の動作確認
それでは、[goods_ctl.php]から[注文一覧]を
クリックし、[注文ダウンロード]をクリックします。

保存するファイルの保存先を選択し保存すると
csvファイルがダウンロードされます。

項目が多いので横長になりました。
このように、データベースの2つのテーブルを連結して
読み込むことができます。
コメント