【PHP】Webサービス上で行うお知らせ機能の実装

# Webサービス上で行うお知らせ機能の実装
今回はwebサービス内でお知らせ機能を実装する方法をアウトプットして書き残します。

## 考え方
1,logintimeテーブルに接続し前回のログイン時間があるかどうか確認する。
2,ログイン時間がなければログイン時間を保存
3,ログイン時間があれば取得
4,そのログイン時間を変数に格納する
5,ログイン時間の更新
6,4で取得したログイン時間以降の投稿をDBから件数として取得する

## ログイン時間はtime()関数を使う
時間を表示させる関数は他にdate()関数があるのですが、今回はtime()関数を使いました。
理由は、考え方３番の【3,1のログイン時間を参照して、その時間以降の投稿を取得する】この時にif文を使用するのですが、time()関数はint型で取得してくれて投稿時間と比較がしやすいためです。

因みに投稿時間にもtime()関数を使用しております。

## time()関数とは
[PHPリファレンス time()](http://php.net/manual/ja/function.time.php)
1970年1月1日を「０秒」とし、現時刻までを秒すうに換算したものです。
使い方はシンプル。

```index.php
time(); // 1551371976
```
これだけです。

##実装方法
まずログイン時間を保存するlogintimeテーブルを作りました。
ブラウザでの流れはこんな感じです。
###ブラウザでの流れ
```index.php
$user_id = $_SESSION['user_id'];
//お知らせ機能処理====================================================================
$time = time();
//logintimeテーブルのuser_idの登録件数を取り出す
$timeCount = timeCount($user_id);

if($timeCount['count(*)'] == 0){ //もし$timeCountが「0」なら・・つまり何も登録されてなければ

  //ログイン時間を挿入
  timeInsert($user_id,$time);

}else{ //登録されていれば

  //user_idのloginTimeを取り出す
  $loginTime = timeSelect($user_id);
  $beforeTime = $loginTime['loginTime'];

  //ログイン時間をアップデートする
  timeUpdate($user_id,$time);
  
}
```

time()関数を変数$timeに格納します。

その後[timeCount()]という関数を作り$_SESSION['user_id']を元にユーザーがlogintimeテーブルに登録されているかどうかを判断します。
### timeCount()
```function.php
//user_idの登録件数を取り出す
function timeCount($user_id){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'SELECT count(*) FROM logintime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを１レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生：' . $e->getMessage());
  }
}
```
ここでreturnで返ってきたtimeCount()の値を条件にif文を使います。この値が0ならまだlogintimeテーブルにはそのユーザー情報が入っていないので、変数$timeを使用しINSERTします。
###ログイン時間INSERT
```function.php
function timeInsert($user_id,$time){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'INSERT INTO logintime (user_id,loginTime) VALUES(:user_id,:loginTime)';
    $data = array(':user_id' => $user_id,
                  ':loginTime' => $time);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを１レコード返却
  } catch (Exception $e) {
    error_log('エラー発生：' . $e->getMessage());
  }
}
```
もしreturnの値が0じゃなければ、logintimeテーブルに保存されているので、保存されているログイン時間を取得します。

###ログイン時間取得
```function.php
function timeSelect($user_id){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'SELECT loginTime FROM logintime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを１レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生：' . $e->getMessage());
  }
}
```
取得したログイン時間以降の投稿をあとで取得するので変数に格納します。
その後ログイン時間をアップデートします。

###ログイン時間アップデート
```function.php
function timeUpdate($user_id,$time){
  debug('ユーザー情報を取得します。');
  //例外処理
  try {
    //DBへ接続
    $dbh = dbConnect();
    // SQL文作成
    $sql = 'UPDATE logintime SET loginTime = :loginTime WHERE user_id = :user_id';
    $data = array(':user_id' => $user_id,
                  ':loginTime' => $time);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);
    // クエリ結果のデータを１レコード返却
    if($stmt){
      return $stmt->fetch(PDO::FETCH_ASSOC);
    } else {
      return false;
    }
  } catch (Exception $e) {
    error_log('エラー発生：' . $e->getMessage());
  }
}
```
これで前回のログイン時間の取得とログイン時間の更新が終わりました。
次は、取得した前回のログイン時間を使ってpostsテーブルからこの時間以降の投稿を取得し件数としてブラウザに表示するだけです。
なのでcount(*)でSQL文を書いてください。

以上がPHPによるお知らせ機能実装方法です。

再度流れをまとめます。
1,logintimeテーブルに接続し前回のログイン時間があるかどうか確認する。
2,ログイン時間がなければログイン時間を保存
3,ログイン時間があれば取得
4,そのログイン時間を変数に格納する
5,ログイン時間の更新
6,4で取得したログイン時間以降の投稿をDBから件数として取得する

次はモバイルに直接お知らせをしてくれるような機能を実装したいと思います。