【サンプルあり】データベースに登録したテーブルのデータを読み書きしてみよう

PHP PHP

下記記事のプログラムをベースに、今回はテーブルの読み書きの処理を実装していきたいと思います。

内容説明

今回はテーブルの読み書きということで、勤怠システムの出勤時間と退勤時間を例にしたいと思います。

テーブル準備

下記画像のように、phpmyadminから、testデータベースにkintaiテーブルと、その中身を登録しておきます。
ポイントとしては、テーブル作成後に、syain_noカラムに1を登録しておくことです。

勤怠テーブル作成
テーブル作成
データ登録
syain_noに1を登録

完成コード

少し長いですが、完成コードです。

.push {
  cursor: pointer;
  display: inline-block;
  color: white;
  font-weight: bold;
  padding: 10px;
}
.btn_green{
  background-color: green;
}
.btn_red{
  background-color: red;
}
.btn_white{
  border: 1px solid;
  color: black;
  background-color: white;
}

上記コードをコピー&ペーストしてC:/xampp/htdocs/test/style.cssに保存してください。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>出勤/退勤ボタン</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <?php
        $syain_no       = 1 ;
        $WHERE_syain_no = 'WHERE syain_no='.$syain_no ;
        if(isset($_GET['status'])==false){
            print '<p>直接アクセスしました。</p>';
        }else{
            //データベースにアクセス
            $dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
            $user = 'root';
            $password ='';
            $dbh = new PDO($dsn,$user,$password);
            $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            
            //勤怠テーブルから今日の分を読み込み
            $sql = 'SELECT * FROM kintai WHERE syain_no="'.$syain_no.'"' ;
            $stmt=$dbh->prepare($sql);
            $stmt->execute();
            $kintai_rec = $stmt->fetch(PDO::FETCH_ASSOC);
            
            //社員番号が登録済みのときだけ処理を行う。
            if(isset($kintai_rec['id'])==true){
                if($_GET['status']==1){
                    //出勤をクリックしたときの処理
                    if($kintai_rec['date']==NULL){
                        //今日は出勤していない場合
                        $now_date     = date('Y-m-d');
                        $now_datetime = date('Y-m-d H:m:s');
                        print '<p>出勤しました。<br>'.$now_datetime.'</p>';
                        
                        //kintaiテーブルに今日の出勤時間を登録する
                        $sql = 'UPDATE kintai SET date="'.$now_date.'", s_time="'.$now_datetime.'" '.$WHERE_syain_no;
                        $stmt = $dbh->prepare($sql);
                        $stmt->execute();
                    }else{
                        //今日は出勤している場合
                        print '<p>出勤済みです。<br>出勤時間:'.$kintai_rec['s_time'].'</p>';
                    }
                }else if($_GET['status']==2){
                    //退勤をクリックしたときの処理
                    if($kintai_rec['date']!=NULL && $kintai_rec['s_time']!=NULL && $kintai_rec['e_time']==NULL){
                        //今日は出勤していて、まだ退勤していない場合
                        $now_datetime = date('Y-m-d H:m:s');
                        print '<p>退勤しました。<br>'.$now_datetime.'</p>';
                        
                        //kintaiテーブルに今日の退勤時間を登録する
                        $sql = 'UPDATE kintai SET e_time="'.$now_datetime.'" '.$WHERE_syain_no;
                        $stmt = $dbh->prepare($sql);
                        $stmt->execute();
                    }else if($kintai_rec['e_time']!=NULL){
                        //今日は退勤している場合
                        print '<p>退勤済みです。<br>退勤時間:'.$kintai_rec['e_time'].'</p>';
                    }else if($kintai_rec['date']==NULL || $kintai_rec['s_time']==NULL){
                        //今日は出勤していない場合
                        print '<p>出勤していません。<br><br></p>';
                    }
                    
                }else if($_GET['status']==3){
                    //リセットをクリックしたときの処理
                    $sql = 'UPDATE kintai SET date=NULL, s_time=NULL, e_time=NULL '.$WHERE_syain_no;
                    $stmt = $dbh->prepare($sql);
                    $stmt->execute();
                    print '<p>リセットしました。<br><br></p>';
                }else {
                    print '<p>想定していないstatus。<br><br></p>';
                }
            }
        }
    ?>
    <a class="push btn_green" href="study_dakoku.html?status=1">出勤</a>
    <a class="push btn_red" href="study_dakoku.html?status=2">退勤</a>
    <a class="push btn_white" href="study_dakoku.html?status=3">出勤/退勤消去</a>
    
</body>
</html>

上記コードをコピー&ペーストしてC:/xampp/htdocs/test/study_dakoku.htmlに保存、 xamppを起動し、ブラウザで表示してください。

出勤クリック
出勤をクリック

退勤クリック
退勤をクリック

リセットクリック
出勤/退勤消去をクリック

ポイント解説

15行目~20行目はおなじみのデータベース読み出しです。
23行目~26行目で、kintaiテーブルのsyain_noが1のレコードを取得します。
以降、$kintai_rec[‘カラム’]で値が参照できます。

$_GET[‘status’]==1(出勤をクリック)の場合、出勤していないかチェック($kintai_rec[‘date’]がNULL)します。
出勤していた場合($kintai_rec[‘date’]がNULLではない)は出勤時間を表示($kintai_rec[‘s_time’])します。
出勤していない場合は、現在時刻をdate関数で取得して、出勤時間を登録します。(34行目~41行目)

$_GET[‘status’]==2(退勤をクリック)の場合、出勤済み且つ退勤していないかチェックします。
出勤していない場合($kintai_rec[‘date’]がNULL または $kintai_rec[‘s_time’]がNULL)は、出勤していない旨を表示します。
退勤済みの場合($kintai_rec[‘e_time’]がNULLではない)は、退勤時間を表示($kintai_rec[‘e_time’])します。
出勤済み且つ退勤していない場合は、現在時刻をdate関数で取得して、退勤時間を登録します。(50行目~56行目)

$_GET[‘status’]==3(出勤/退勤消去)の場合、出勤日付(date)、出勤時間(s_time)、退勤時間(e_time)をそれぞれNULLにします。(67行目~69行目)
本来ならば、退勤クリック後に別テーブルに記録し、出退勤情報を消去するかと思います。