前回は選択項目を画面から更新したり削除する機能を実装しました。
家計簿としての最低限の機能は実装しました。今回からはデータの検索やアカウント機能など実用的な機能を追加していきます。
↓前回の記事はこちら
データの検索機能
今回は日付検索の機能を実装していきます。いくつか検索パターンがあるので順番に実装します。
・検索がかかっていないとき(ページが開かれた時点など)
・日付指定で検索がかけられているとき
・全データ表示のとき
実際に指定された期間のデータを出力する実装は最後にまとめて行います。
検索がかかっていない場合
ページが開かれたときや別のページから遷移されたときなど検索がかかっていないときのデータ出力を実装します。
検索がかかっていない時の状態も実装するのは、データが多くなった時に表示数が長くなり見づらくなるのを防ぐためです。今回は検索がない場合は、当月分のみを表示する処理にします。
まずはデータ一覧の上部にある日付を入力するinputに当月の1日と当日の日付が入るようにします。
以下をindex.phpの冒頭に記述します。
//日付データ検索
if(isset($_POST['search'])):
//検索が押されたときの処理
else:
$searchDateFrom = date('Y-m-01');
$searchDateTo = date('Y-m-d');
endif;
日付検索のコーディング部分にtype=hiddenでvalueをsearchとしているinput要素があるので、まずはこれがあるかないかで検索がされている状態かそうでないかを判断します。
今回は検索がされていない状態の処理なのでelseの中に処理を記述しました。
このあと記述しますが、変数にinputのvalueに入れる値を格納してそれをinputのvalueに出力する仕様にします。そのため検索がかけられていないときは、当月の1日(=’Y-m-01’)と当日(=’Y-m-d’)を変数にセットしました。
それではこの変数を日付入力のinputに出力します。
<!--207行目付近-->
<input type="date" id="dateFrom" name="date_from" value="<?php echo $searchDateFrom; ?>">
〜
<input type="date" id="dateTo" name="date_to" value="<?php echo $searchDateTo; ?>">
ここまで実装できると画面の日付入力部分が、当月の1日と当日にセットされます。
日付指定の検索がかかっている場合
続いて日付が入力され検索が押下されたときの日付出力です。
if (isset($_POST['search']) && isset($_POST['date-search'])) : //条件を追加
//以下の検索が押されたときの処理を追記
$date_from = filter_input(INPUT_POST, 'date_from', FILTER_SANITIZE_SPECIAL_CHARS);
$date_to = filter_input(INPUT_POST, 'date_to', FILTER_SANITIZE_SPECIAL_CHARS);
$searchDateFrom = $date_from;
$searchDateTo = $date_to;
先程記述したif文の条件に、検索ボタンが押されたことを示す条件を追加してその中に処理を記述します。
まずは念の為送られてきたデータにフィルターをかけた値を変数にセットし、日付入力inputのvalueに出力する変数にそれぞれの値をセットしました。
上記を実装することで、日付を選択後検索ボタン押下で選択した日付が保持されたままになります。
全データ表示が押下された場合
検索ボタンの隣りにある「全データ表示」が押下されたときの処理を記述します。
elseif(isset($_POST['search']) && isset($_POST['all-search'])):
$searchDateFrom = '';
$searchDateTo = date('Y-m-d');
上記を先程検索ボタンが押下されたときの処理(if文処理)の下に記述します。
全データでははじめの日付は空欄にすることで、全てのデータを出力できるようにします。
最後に指定された通りのデータを出力するように実装していきます。
指定された日付のデータを出力
指定されたデータを出力するにはSQL発行&実行を少し修正することで実装できます。
//WHERE文を追加(246行目付近〜)
$sql_dataoutput = '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.memo, 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
WHERE records.date >=? AND records.date <=? //←追加
ORDER BY date DESC, input_time DESC';
$stmt_dataoutput = $db->prepare($sql_dataoutput);
//以下を追加(スマホ表示用のプログラムにも追加)
$stmt_dataoutput->bind_param('ss', $searchDateFrom, $searchDateTo);
まずはSQL文にWHERE分を追加し、recordsテーブルのdateカラムが入力された値以上or以下であることを条件にします。
実際の値は「?」としbind_paramで変数をセットしています。
以上を追記すると入力した日付の範囲のデータが出力されます。
以上で日付検索機能は完成です。
最後に
今回は日付を指定したデータ検索の機能を実装しました。
次回はログインやユーザー登録など、アカウント機能を実装しようと思います。
最後までお読みいただきありがとうございました。
コメント