【第四回】コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー

#前回までのあらすじ
[【第三回】コロナ禍だから何かできることを](https://qiita.com/STYLE-D/items/345e9142948c00330e71)

####実装イメージ図
LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。
![メイン.00_00_51_12.Still002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/cf85391e-aef8-5a59-0a1d-63d8e15412ce.jpeg)

##取得したデータをもとに、データベースへの更新までの流れを考えよう
![システム構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/ac5262ba-5db6-bdc3-d7f1-6c007182fce8.jpeg)

今回は、体温や体調の報告の場合はユーザー状態をDBへ保存する処理を説明します。
データベースはMYSQLを使用します。
エラー時の時は、エラーだったことを返す処理の方が親切なんですが、ひとまず終了としときます。

###データベースへの接続方法

```php5
// 宣言
define("DATABASE_URL", 'mysql:host=アドレス;dbname=データベース名;charset=utf8');
define("DATABASE_USER", '接続ユーザー名');
define("DATABASE_PASS", '接続パスワード');

try{
    // 接続処理
    $dbh = new PDO(DATABASE_URL, DATABASE_USER, DATABASE_PASS);
    // 静的プレースホルダを指定
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    // エラー発生時に例外を投げる
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $ex){
    exit;
}

```

###ユーザー情報の取得方法

```php5
//LINE IDを利用して、ユーザーが存在するかチェックを行う
try{
    $SQL =
    <<<EOM
        SELECT
            USER_ID,
            USER_NAME
        FROM
            LINE_USER
        WHERE
            LINE_ID		= :line_id
    EOM;
    $stmt = $dbh->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->bindParam('line_id', $line_id, PDO::PARAM_STR);
    $stmt->execute();
}catch(PDOException $ex){
    exit;
}

//ユーザーIDとユーザー名を取得しておく。
if($stmt->rowCount()>=0){
    $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);
    $user_id = $row[0];
    $user_name = $row[1];
}

```

###データの登録方法
LINE_ACCESSのテーブルはLINEでアクションがあったときの履歴保存用（いつ、だれが、どんなメッセージを送ってきたか）
LINE_USERは登録ユーザーの情報（ユーザーIDとLINE IDとユーザー名と最後にアクションがあった日時）

```php5
    //トランザクション処理を開始
    $dbh->beginTransaction();
    try {
        $SQL =
        <<<EOM
            INSERT INTO LINE_ACCESS(
                USER_ID,
                ACCESS_DATE,
                MESSAGE
            )VALUES(
                :user_id,
                NOW(),
                :message
            )
        EOM;
        $stmt = $dbh->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
        $stmt->bindParam(':user_id', $user_id, PDO::PARAM_STR);
        $stmt->bindParam(':message', $message_text, PDO::PARAM_STR);
        $stmt->execute();

        $SQL =
        <<<EOM
            UPDATE LINE_USER
            SET
                LAST_ACCESS = NOW()
            WHERE
                USER_ID     = :user_id
        EOM;
        $stmt = $dbh->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
        $stmt->bindParam(':user_id', $user_id, PDO::PARAM_STR);
        $stmt->execute();

        //コミット
        $dbh->commit();
    }catch(Exception $ex){
        //ロールバック
        $dbh->rollback();
    }
```

これを見て2点、気づいたかたもいるかもしれません。
#####１．LINE IDをユーザーIDになんでしてないの？LINE IDだけでいいんじゃないの？
LINEを利用していない自宅療養者もいるため、敢えて別ユーザーIDを作成しています。

#####２．ユーザー登録はどうやるねん！
ということで、次回はユーザー登録の実装（LIFF）について説明します。

#コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー
[【第一回】実装イメージ図と動画](https://qiita.com/STYLE-D/items/743bbecae1c52be15505)
[【第二回】LINEからデータを取得して返すまでの流れ](https://qiita.com/STYLE-D/items/9e0addd8df44be8590b7)
[【第三回】LINEからデータベースまでの流れ](https://qiita.com/STYLE-D/items/345e9142948c00330e71)
->>[【第四回】データベースへの更新までの流れ](https://qiita.com/STYLE-D/items/8af17d7f94f5c351ede0)
[【第五回】ユーザー登録の仕組み-LINEbotの設定部分](https://qiita.com/STYLE-D/items/a745bd5faeb68caa1d7c)
[【第六回】ユーザー登録の仕組みLIFFで表示する画面の開発](https://qiita.com/STYLE-D/items/321038c8028eb9e9231f)
[【第七回】データベースの構造](https://qiita.com/STYLE-D/items/71085dc9a04042f33f0e)
[【第八回】WEB画面上でできる機能](https://qiita.com/STYLE-D/items/c32e9098a3948e8f32f2)
[【第九回】まとめ](https://qiita.com/STYLE-D/items/77eb6a8e61ae2201565f)