下記記事のプログラムをベースに、今回はテーブルの読み書きの処理を実装していきたいと思います。
内容説明
今回はテーブルの読み書きということで、勤怠システムの出勤時間と退勤時間を例にしたいと思います。
テーブル準備
下記画像のように、phpmyadminから、testデータベースにkintaiテーブルと、その中身を登録しておきます。
ポイントとしては、テーブル作成後に、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行目)
本来ならば、退勤クリック後に別テーブルに記録し、出退勤情報を消去するかと思います。