前回はログインとログアウト機能を実装しました。これで各ユーザーがデータを登録するようになります。
そこで今回はログインしているユーザーが登録したデータのみを出力するようにします。
↓前回の記事はこちら
新規ユーザー登録完了後の初回ログインで、初期設定画面へ誘導する実装を前回行いました。
まずは初期設定画面をユーザー情報と連携するようにします。
ウェルカムメッセージを初期ログインのときだけ出力
「初期設定へ」の先のページは、カテゴリー編集ページに遷移します。
このページでは現在常時緑背景のメッセージが表示されますが、このメッセージを初期ログインのときだけ出力するようにします。
<?php if (isset($_SESSION['login_times']) && $_SESSION['login_times'] === "first") : ?> <!---追加->
<section class="p-section p-section__message">
<div class="p-message-box p-message-box--success">
<p>
OOOOさん、家計簿アプリへようこそ!<br>
まずは支出カテゴリーを登録しましょう。<br>
支出のカテゴリーが登録できたら、【他のカテゴリーを編集】から他の項目も登録してみましょう!<br>
<span>※このメッセージは画面を更新・他ページへ遷移すると消えます</span>
</p>
</div>
</section>
<?php endif; ?> <!---追加->
ウェルカムメッセージをif文で囲み、ユーザー登録時に保存していた初期ログインのセッション情報に「first」が保存されているときだけ表示するようにしました。
そしてウェルカムメッセージ内の「〇〇〇〇さん」の部分をユーザーニックネームと連携させます。
<?php echo h($nickname); ?>さん、家計簿アプリへようこそ!<br>
続いてウェルカムメッセージ米印の実装を行います。
まずこのメッセージはセッションに初期ログインであるという情報が存在しているときに表示するようにしています。
なのでこの情報を削除してしまえばメッセージを消すことができます。
</section>
<!--以下1行を追加-->
<?php unset($_SESSION['login_times']); ?>
<?php endif; ?>
ウェルカムメッセージの要素のすぐ下でセッションを削除しました。これで1度表示したあと再読み込みをしたり別のページに移るとウェルカムメッセージは表示されなくなります。
ユーザーが登録しているデータだけを出力
現在カテゴリーにはデータベースの情報すべてがどのユーザーにも出力されています。
これをユーザーが登録したデータだけを出力するように修正します。
・データベースのテーブルに「user_id」を追加
・SQLにユーザーIDが一致するという条件を追加
・データがないときは「データがありません」を出力
↑の順番で実装していきます。
データベースのテーブルに「user_id」を追加
ユーザーごとに出力を分けるため、データベースに作ったそれぞれのテーブルに「user_id」のカラムを追加します。
userテーブル以外に「user_id」カラムを「INT」で追加する
user_idカラムを追加すると、全ての既存データには「0」が入ります。
このままではうまく出力できないので、一部を除きuser_idの値を差し替えます。
差し替えないuser_idの値
・payment_methodテーブル「現金」「クレジット」「スマホ決済」
その他のuser_idの値
・userテーブルのidカラムに存在する数値をuser_idにランダム書き換え
recordテーブルにそれぞれのカテゴリーと紐付いている数値が入っていますが、一旦無視してランダムにuser_idカラムを書き換えました。
SQLにユーザーIDが一致するという条件を追加
カテゴリーやレコードデータなど、現在登録されてる全てのデータが出力されているのでSQLにユーザーIDが一致するデータだけ出力するように修正します。
index.phpファイル内の書き換え
データ入力選択項目部分(record-edit.phpの同箇所も修正)
//SQL変更&bind_param設定
//index.php 109・126・168・187行目付近
//record-edit.php 99・114・153・172行目付近
$stmt_〇〇 = $db->prepare('SELECT id, name FROM 各テーブル名 WHERE user_id = ?');
$stmt_〇〇->bind_param('i', $user_id);
//支払い方法のSQL(index.php→151行目付近、record-edit.php→136行目付近)
$stmt_paymethod = $db->prepare('SELECT id, name FROM payment_method WHERE id>3 AND user_id = ?');
レコード出力のSQL文(スマホ出力部分も同様)
//WHERE句に条件追加(247行目付近)
WHERE records.date >=? AND records.date <=? AND records.user_id = ?
//bind_paramに値を追加(259行目付近・359行目付近)
$stmt->bind_param('ssi', $searchDateFrom, $searchDateTo, $user_id);
item-edit.phpファイル内の書き換え
選択項目出力部分SQL
//書き換え前
$stmt = $db->prepare("SELECT id, name FROM {$table_name}");
//書き換え後 109行目付近
if ($table_name === 'payment_method') :
$stmt = $db->prepare("SELECT id, name FROM {$table_name} WHERE user_id=? OR user_id=0");
else :
$stmt = $db->prepare("SELECT id, name FROM {$table_name} WHERE user_id=?");
endif;
$stmt->bind_param('i', $user_id); //追加
record-edit.phpファイル内の書き換え
編集データ検索部分SQL
//14行目付近
WHERE id =? AND user_id = ? LIMIT 1'; //WHEREに条件を追加
$stmt->bind_param('ii', $record_id, $user_id); //bind_param追加
まだ完全ではありませんが、これでユーザーが登録したデータのみが出力されるようになりました。
「item-edit.php」のSQLですが、支払い方法の操作禁止項目も出力したいため、「$table_name」に支払い方法が格納されているときはuser_idがログイン中のユーザーのものと一致するという条件と、user_idが「0」の項目療法を抽出するSQLを生成しています。
※先程、user_idカラム追加時にほかテーブルと連携している数値を無視して追加したため、レコード編集に移動すると復元できない情報があります。
この点については現在あるデータを全て削除して新しく作成するか、既存データで復元できなかった項目を新しく編集して更新するなどしてください。
データがないときは「データがありません」を出力
カテゴリーやレコードデータが存在しないときは、「データがありません」という1行を出力します。
修正方法としてはまず「while($stmt->fetch())」とデータをwhileで繰り返し取り出しをした後にif分を追加し、データがないときはそちらを出力させるという処理を追加します。
まずはindex.phpのレコード出力部分PC版から修正します。
//259行目付近
sql_check($stmt_dataoutput, $db);
$stmt_dataoutput->store_result(); //追加
$count = $stmt_dataoutput->num_rows(); //追加
$stmt_dataoutput->bind_result(
:
:
);
<?php while ($stmt_dataoutput->fetch()) : ?>
<tr>それぞれの出力(省略)</tr>
<?php endwhile; ?>
<!--以下追加 329行目付近-->
<?php if ($count === 0) : ?>
<tr class="nodata">
<td colspan="6">データがありません</td>
</tr>
<?php endif; ?>
続いてスマホ画面時のデータ出力箇所も修正していきます。
//368m行目付近
sql_check($stmt_dataoutput, $db);
$stmt_dataoutput->store_result(); //追加
$count = $stmt_dataoutput->num_rows(); //追加
:
省略
:
while ($stmt_dataoutput->fetch()) : ?>
:
省略
:
<?php endwhile; ?>
<!--以下追加 445行目付近-->
<?php if ($count === 0) : ?>
<div class="p-sp-data-box nodata">
<p>データがありません</p>
</div>
<?php endif; ?>
以上でレコードデータの出力部分の修正は完了です。
続いて選択項目の編集画面でデータがない場合の出力修正を実装していきます。
//111行目付近
sql_check($stmt, $db);
$stmt->store_result(); //追加
$count = $stmt->num_rows(); //追加
$stmt->bind_result($id, $name);
while ($stmt->fetch()) :
?>
:
省略
:
<?php endwhile;
//以下追加 132行目付近
if ($count === 0) : ?>
<tr class="nodata">
<td colspan="2">データがありません</td>
</tr>
<?php endif;
修正方法は先程と同様に、「$stmt->store_result(); $count = $stmt->num_rows();」でデータの行数を取得し、データ行数が「0」のときのみデータがありませんという行を出力するようにしています。
選択項目編集ページはスマホも同じ出力なので以上の修正で完了です。
最後に
今回はウェルカムメッセージを特定の条件下のみ表示させたり、レコードや選択項目をユーザーが登録したものだけ出力するなどユーザーの情報と連携させる実装を行いました。
次回はユーザー連携の続きでレコードや選択項目の追加や編集、削除のユーザー連携の機能を実装していきます。
最後までお読みいただきありがとうございました。
コメント