今回はrecordsテーブルに格納している収支データを画面に出力していきます。
前回の記事はこちら↓
今回は「SQLの発行」と「呼び出しデータをテーブルに出力」の2本柱で進めていきます。
SQLの発行
まず収支データを登録しているrecordsテーブルのデータの入り方をおさらいします。

赤枠で囲ったカラムを出力したいのですが、赤枠左から3カラム分はそのまま呼び出して出力すればOKです。
しかしそれ以外のカラムは数値になっているので、文字列の値を出力したいです。
このrecordsに記録されている数値は、該当するテーブルのidと連動しています。
なのでSQLを発行するときに、それぞれのテーブルを見に行って文字列を取得するようにします。

そのSQLというのが以下になります。
<?php
$sql = 'SELECT records.id, records.date, records.title, records.amount, records.spending_category,
spending_category.name, records.income_category, income_category.name, records.type, records.payment_method,
payment_method.name, records.credit, creditcard.name, records.qr, qr.name, records.input_time
FROM records
LEFT JOIN spending_category ON records.spending_category = spending_category.id
LEFT JOIN income_category ON records.income_category = income_category.id
LEFT JOIN payment_method ON records.payment_method = payment_method.id
LEFT JOIN creditcard ON records.credit = creditcard.id
LEFT JOIN qr ON records.qr = qr.id
ORDER BY date DESC, input_time DESC';
まずはSELECTで取得するカラムを指定しています。基本形は「〇〇.△△」で〇〇にテーブル名を、△△にカラム名を記述します。
今回はrecordsテーブルからそのまま取得するデータはrecords.カラム名、他のテーブルを参照するデータは該当テーブル名.nameと記述します。
そしてLEFT JOINで該当カラムの数値とidが連携しているテーブルをつなげて参照します。
基本形は「LEFT JOIN 参照するテーブル名 ON records.カラム名 = 参照するテーブル名.id」です。
最後にデータの日付が近いものを先頭に並べるよう「date DESC」で指示をし、データの日付が同じ場合は入力した日付が遅いデータを先頭に並べるよう「input_time DESC」で指示をしています。
続いてこれまで通りSQLの実行と得られた値を変数に格納しループを始めます。
$stmt = $db->prepare($sql);
$success = $stmt->execute();
$stmt->bind_result(
$id,
$date,
$title,
$amount,
$sc_value,
$spending_category,
$ic_value,
$income_category,
$type,
$pm_value,
$paymentmethod,
$credit_value,
$credit,
$qr_value,
$qr,
$input_time
);
while ($stmt->fetch()) : ?>
<tr class="record">
<td>2022-05-02</td>
<td>
タイトル
<span>(カテゴリー)</span>
</td>
<td></td>
<td>
¥1000
<span>(支払い方法)</span>
</td>
<td>カード名</td>
<td>
<a class='edit' href=''>編集</a>
<a class='delete' href=''>削除</a>
</td>
</tr>
<?php endwhile; ?>
それでは取り出したデータを出力していきます。
データを出力
出力テーブルの左カラムから順番に実装していきます。
日付を出力
<!--書き換え前-->
<td>2022-05-02</td>
<!--書き換え後-->
<td><?php echo date('Y/m/d', strtotime($date)); ?></td>
date関数を使って「ー」区切りを「/」区切りにするよう変換して出力しています。
date関数は第1引数にフォーマットを指定し、第2引数に指定したフォーマットに変換したいタイムスタンプを指定します。第2引数は省略することができ、省略した場合は現在の時刻が自動的に入れられます。
ここまでを指定すると収支日カラムだけDBと連携します。

タイトル・カテゴリー出力
続いてタイトルとカテゴリーを出力します。カテゴリーについてはデータが支出か収入かで呼び出す変数が異なるのでif文を使って条件分岐を行います。
<!--書き換え前-->
<td>
タイトル
<span>(カテゴリー)</span>
</td>
<!--書き換え後-->
<td>
<?php echo h($title); ?>
<span>
<?php
if ($type === 0 && $spending_category !== null) {
echo '(' . h($spending_category) . ')';
} else if ($type === 1 && $income_category !== null) {
echo '(' . h($income_category) . ')';
} else {
echo "(不明)";
}
?>
</span>
</td>
タイトルはそのままechoします。
カテゴリーの出力は$typeに格納されている数値を使って、支出か収入かを判断しカテゴリーがnullではないときにそれぞれのカテゴリーを出力するよう指示しています。
ここまで実装すると以下のようにタイトルカラムも連携しました。

収入金額の出力
収入金額と支出金額も$typeの値を使って出力します。
<!--書き換え前-->
<td></td>
<!--書き換え後-->
<td>
<?php echo $type === 1 ? '¥' . number_format($amount) : ''; ?>
</td>
$type === 1 という条件(収入データかどうか)を評価し、trueであれば ‘¥’ . number_format($amount)を返し、falseであれば ‘ ‘ (空)を返す演算子です。
number_format($amount)で3桁ごと「,」で区切るようフォーマット指定しています。
支出金額と支払い方法の出力
続いて支出カラムを出力します。金額については収入カラム同様に三項演算子を使って出力します。
<!--書き換え前-->
<td>
¥1000
<span>(支払い方法)</span>
</td>
<!--書き換え後-->
<td>
<?php echo $type === 0 ? '¥' . number_format($amount) : ''; ?>
<span>(支払い方法)</span>
</td>
続けて支払い方法の出力を条件分岐を使って記述します。
<!--書き換え前-->
<span>(支払い方法)</span>
<!--書き換え後-->
<span>
<?php
if ($type === 0 && $paymentmethod !== null) {
echo '(' . h($paymentmethod) . ')';
} else if ($type === 1) {
echo "";
} else {
echo "(不明)";
}
?>
</span>
支出or収入の数値が入っている$typeを使って、支出データ&支払い方法が記録されている場合は支払い方法を出力します。
収入データのときは空文字を出力し、どの条件にも当てはまらない場合は(不明)を出力するよう記述しています。
ここまで実装すると、支出収入カラムがDBと連携します。

支出詳細の出力
続いて支払い方法が「クレジットカード」「QR決済」だったとき、その項目を支出詳細カラムに出力します。
<!--書き換え前-->
<td>カード名</td>
<!--書き換え後-->
<td>
<?php echo $paymentmethod === "クレジットカード" ? h($credit) : '' ?>
<?php echo $paymentmethod === "QR決済" ? h($qr) : '' ?>
</td>
金額の出力と同様に三項演算子で条件式を評価し値を返すよう記述しました。
<?php
$sql = 'SELECT records.id, records.date, records.title, records.amount,
records.spending_category, spending_category.name, records.income_category,
income_category.name, records.type, records.payment_method,
payment_method.name, records.credit, creditcard.name, records.qr, qr.name,
records.input_time
FROM records
LEFT JOIN spending_category ON records.spending_category = spending_category.id
LEFT JOIN income_category ON records.income_category = income_category.id
LEFT JOIN payment_method ON records.payment_method = payment_method.id
LEFT JOIN creditcard ON records.credit = creditcard.id
LEFT JOIN qr ON records.qr = qr.id
ORDER BY date DESC, input_time DESC';
$stmt = $db->prepare($sql);
$success = $stmt->execute();
$stmt->bind_result(
$id,
$date,
$title,
$amount,
$sc_value,
$spending_category,
$ic_value,
$income_category,
$type,
$pm_value,
$paymentmethod,
$credit_value,
$credit,
$qr_value,
$qr,
$input_time
);
while ($stmt->fetch()) : ?>
<tr class="record">
<td><?php echo date('Y/m/d', strtotime($date)); ?></td>
<td>
<?php echo h($title); ?>
<span>
<?php
if ($type === 0 && $spending_category !== null) {
echo '(' . h($spending_category) . ')';
} else if ($type === 1 && $income_category !== null) {
echo '(' . h($income_category) . ')';
} else {
echo "(不明)";
}
?>
</span>
</td>
<td>
<?php echo $type === 1 ? '¥' . number_format($amount) : ''; ?>
</td>
<td>
<?php echo $type === 0 ? '¥' . number_format($amount) : ''; ?>
<span>
<?php
if ($type === 0 && $paymentmethod !== null) {
echo '(' . h($paymentmethod) . ')';
} else if ($type === 1) {
echo "";
} else {
echo "(不明)";
}
?>
</span>
</td>
<td>
<?php echo $paymentmethod === "クレジットカード" ? h($credit) : '' ?>
<?php echo $paymentmethod === "QR決済" ? h($qr) : '' ?>
</td>
<td>
<a class='edit' href='./edit.php'>編集</a>
<a class='delete' href='./delete.php'>削除</a>
</td>
</tr>
<?php endwhile; ?>
最後に
ここまでで収支一覧テーブルにデータを出力することができました。

次回は操作カラムの編集と削除ボタンでデータを操作できるように実装していきます。
最後までお読みいただきありがとうございました。
コメント