webdata
DX推進をサポートする技術者向け情報提供サイト

初心者向けPHP・データベース入門

TOP >初心者向けPHP・データベース入門 >3.2 日報システム作成(登録画面作成)

【PHP入門】日報システム作成(登録画面作成)

 2023-06-24 (更新日:2023-06-24)

<学習する内容>

 複数テーブル、複数プログラムを使ったプログラムの作成を経験します
 本ページでは設計と登録画面を作成します。

1)目的

・業務を記録すること
・Webにより入力、閲覧を容易にすること

<流れ>
①設計
②テーブル作成
③登録画面作成
④日報一覧表示画面作成
⑤マスター登録機能追加
⑥検索機能等日報一覧に追加機能
⑦集計プログラム作成

2)日報システムのテーブル設計

 設計 テーブル名:dailyreport  
項目 カラム名 データ型 長さ 備考
ID id int 11 primary key、auto_increment
部署コード sectionCode smallint 4 部署マスターとリレーション
担当者コード staffCode smallint 4 担当者マスターとリレーション
作業分類 class tinyint 2 1:顧客訪問、2:社内作業
作業日 workDate date
作業年月 workMonth int 11 YYYYMM、月毎集計に利用
得意先コード customerCode int 11 得意先マスターとリレーション
面談者 interviewer varchar 20
作業・面談内容 comment varchar 1000
登録日 dateInsert datetime
更新日 dateUpdate datetime

 primary key   :プライマリーキー(主キー)
 auto_increment :一意の連番で自動採番できるようにする。

・テーブルの作成
MariaDB [sales]> create table dailyreport (id int primary key auto_increment,sectionCode smallint(4),staffCode smallint(4) ,class tinyint(2),workDate date,workMonth int,customerCode int,interviewer varchar(20),comment varchar(1000) ,dateInsert datetime,dateUpdata datetime);

3)登録画面作成

下記のサンプルプログラムをコピーもしくはダウンロードし指定のフォルダーに配置してください。
ファイル名:dailyreport_input.php
配置先:c:\xampp\htdocs\
配置先URL:http://localhost/dailyreport_input.php

サンプルプログラム名:dailyreport_input.php
						<?php

						//DBへの接続
						include('/xampp/data/conn.php');

						//POSTの受信
							$fnc = filter_input(INPUT_POST, 'fnc');
							$set_id = filter_input(INPUT_POST, 'set_id');
							$set_sectionCode = filter_input(INPUT_POST, 'set_sectionCode');
							$set_staffCode = filter_input(INPUT_POST, 'set_staffCode');
							$set_class = filter_input(INPUT_POST, 'set_class');
							$set_workDate = filter_input(INPUT_POST, 'set_workDate');
							$set_customerCode = filter_input(INPUT_POST, 'set_customerCode');
							$set_interviewer = filter_input(INPUT_POST, 'set_interviewer');
							$set_comment = filter_input(INPUT_POST, 'set_comment');
							$select_id = filter_input(INPUT_POST, 'select_id');
							$select_sectionCode = filter_input(INPUT_POST, 'select_sectionCode');
							$select_staffCode = filter_input(INPUT_POST, 'select_staffCode');
							$select_customerName = filter_input(INPUT_POST, 'select_customerName');
								$select_customerName = mb_convert_kana($select_customerName,'A');

						//変数リセット
							$mess = null;
							$OPT_DATA = null;
							$sectionCode = null;
   							$sectionName = null;
							$staffCode = null;
							$staffName = null;
							$opt_staff = null;
							$class_display = null;
							$opt_section = null;
							$workDate = null;
							$opt_date = null;
							$set_class_display = null;
						
						//変数表示変換
							if($set_class == 1){
								$set_class_display = '得意先訪問';
							}
							if($set_class == 2){
								$set_class_display = '社内作業';
							}
	
						//データチェック
						if($fnc == 1 or $fnc == 2){
							if(empty($set_sectionCode)){
								$no_input = 1;
								$mess = '部署';
							}
							if(empty($set_staffCode)){
								if(!empty($mess)){
									$mess = $mess.'、担当者';
								}else{
									$mess = '担当者';
								}
							}
							if(empty($set_class)){
								if(!empty($mess)){
									$mess = $mess.'、分類';
								}else{
									$mess = '分類';
								}
							}
							if(empty($set_comment)){
								if(!empty($mess)){
									$mess = $mess.'、内容';
								}else{
									$mess = '内容';
								}
							}
							if(!empty($mess)){
								$mess = ''.$mess.'が未登録です。';
							}
							//登録更新SQL
							if(empty($mess)){
									$workMonth = date("Ym",strtotime($workDate)); //日付をYYYYMM形式に変換
									if(empty($set_interviewer)){
										$set_interviewer_inp = 'null';
									}else{
										$set_interviewer_inp = "'$set_interviewer'";
									}
									if(empty($set_customerCode)){
										$set_customerCode = 'null';
									}
									$workMonth = date("Ym",strtotime($set_workDate));
								if($fnc == 1){
									if(empty($set_id)){
										$sql = "INSERT INTO dailyreport
														(
															sectionCode
															,staffCode
															,customerCode
															,class
															,workDate
															,workMonth
															,interviewer
															,comment
														) VALUES (
															$set_sectionCode
															,$set_staffCode
															,$set_customerCode
															,$set_class
															,'$set_workDate'
															,$workMonth
															,$set_interviewer_inp
															,'$set_comment'
														);";
										mysqli_query($conn,$sql) or die ("err_ins $sql");
										$mess = '登録されました。';
										$sql = "SELECT id 
												FROM dailyreport 
												WHERE staffCode = $set_staffCode 
												ORDER BY id DESC;";
										$res = mysqli_query($conn,$sql) or die("error $sql");
										$row = mysqli_fetch_array($res);
											$set_id = $row["id"];
									}else{
										$sql = "update dailyreport set
															sectionCode = $set_sectionCode
															,staffCode = $set_staffCode
															,customerCode = $set_customerCode
															,class = $set_class
															,workDate = '$set_workDate'
															,workMonth = $workMonth
															,interviewer = $set_interviewer_inp
															,comment = '$set_comment'
												WHERE id = $set_id
												;";
										mysqli_query($conn,$sql) or die ("err_up $sql");
										$mess = '更新されました。';
									}
								}
							}
						}
						//削除SQL
						if($fnc == 9){
							$sql = "delete FROM dailyreport WHERE id =$select_id;";
							mysqli_query($conn,$sql) or die ("err_del $sql");
							$mess = 'ID'.$select_id.'が削除されました。';
						}
						
						//修正データ抽出(登録直後および一覧からの修正を$set_idの有無で判定し抽出)
						if(strlen($set_id)){
							$sql = "SELECT b.sectionCode
											,c.staffCode
											,d.customerCode
											,a.workDate
											,a.class
											,a.comment
											,a.interviewer
											,d.customerName
									    FROM dailyreport AS a
									LEFT JOIN Msection AS b 
										ON a.sectionCode = b.sectionCode
									LEFT JOIN Mstaff AS c 
										ON a.staffCode = c.staffCode
									LEFT JOIN Mcustomer AS d 
										ON a.customerCode = d.customerCode
									WHERE a.id = $set_id
									;";
						    $res = mysqli_query($conn,$sql) or die("er select $sql");
						    $row = mysqli_fetch_array($res);
									$set_sectionCode = $row["sectionCode"];
									$set_staffCode = $row["staffCode"];
									$set_workDate = $row["workDate"];
									$set_class = $row["class"];
									$set_interviewer = $row["interviewer"];
									$set_customerCode = $row["customerCode"];
									$select_customerName = $row["customerName"];
									$set_comment = $row["comment"];
							$btn = '更新';			//最下部の「更新」ボタン表示
						}else{
							$btn = '登録';			//最下部の「登録」ボタン表示
						}
						
						//変数表示変換
						if($set_class == 1){
							$set_class_display = '得意先訪問';
						}
						if($set_class == 2){
							$set_class_display = '社内作業';
						}
						
						//部署option
						$sql = "SELECT sectionCode
										,sectionName 
								FROM Msection;";
						$res = mysqli_query($conn,$sql) or die("error$sql");
						while($row = mysqli_fetch_array($res)){
							$sectionCode_opt = $row["sectionCode"];
							$sectionName_opt = $row["sectionName"];
							$opt_section .= '<option value="'.$sectionCode_opt.'">'.$sectionName_opt;
						}
						//選択された部署名の表示
						if(strlen($set_sectionCode)){
							$sql = "SELECT sectionCode
											,sectionName 
									FROM Msection 
									WHERE sectionCode = $set_sectionCode;";
							$res = mysqli_query($conn,$sql) or die("error $sql");
							$row = mysqli_fetch_array($res);
								$sectionName = $row["sectionName"];
						}
						//担当option
						if(strlen($set_sectionCode)){
							$sql = "SELECT staffCode
											,staffName
									FROM Mstaff 
									WHERE sectionCode = $set_sectionCode;";
							$res = mysqli_query($conn,$sql) or die("error $sql");
							while($row = mysqli_fetch_array($res)){
								$staffCode_opt = $row["staffCode"];
								$staffName_opt = $row["staffName"];
								$opt_staff .= '<option value="'.$staffCode_opt.'">'.$staffName_opt;
							}
						}
						//選択された担当者名の表示
						if(strlen($set_staffCode)){
							$sql = "SELECT staffCode
											,staffName 
									FROM Mstaff 
									WHERE staffCode = $set_staffCode;";
							$res = mysqli_query($conn,$sql) or die("error $sql");
							$row = mysqli_fetch_array($res);
								$staffName = $row["staffName"];
						}
						//実施日option
						$day0 = date("Y-m-d");
						$cnt = 10;		  //10日前まで表示
						for( $i = 0 ; $i <= $cnt ; $i++ ){
							$day = date("Y-m-d",strtotime("-$i day",strtotime($day0)));
							$opt_date .= '<option value="'.$day.'">'.$day;
						}
						
						//$_POSTデータの保持
						$OPT_DATA .= '<input type="hidden" name="select_sectionCode" value="'.$select_sectionCode.'">';
						$OPT_DATA .= '<input type="hidden" name="select_staffCode" value="'.$select_staffCode.'">';
						$OPT_DATA .= '<input type="hidden" name="set_sectionCode" value="'.$set_sectionCode.'">';
						$OPT_DATA .= '<input type="hidden" name="set_staffCode" value="'.$set_staffCode.'">';
						$OPT_DATA .= '<input type="hidden" name="set_customerCode" value="'.$set_customerCode.'">';
						$OPT_DATA .= '<input type="hidden" name="set_interviewer" value="'.$set_interviewer.'">';
						$OPT_DATA .= '<input type="hidden" name="set_class" value="'.$set_class.'">';
						$OPT_DATA .= '<input type="hidden" name="set_workDate" value="'.$set_workDate.'">';
						$OPT_DATA .= '<input type="hidden" name="set_id" value="'.$set_id.'">';
						$OPT_DATA .= '<input type="hidden" name="select_customerName" value="'.$select_customerName.'">';
						 
						//HTML本文
						echo <<<EOD
						<!DOCTYPE html>
						<html lang="ja">
						  
						<head>
						<meta charset="utf-8">
						<link rel="stylesheet" href="/style.css" type="text/css">
						<title>日報登録</title>
						</head>
						  
						<body>
						<table style="font-size:12px;">
							<tr>
								<td width="150">日報登録</td>
								<td width="380">{$mess}</td>
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
								<td>
									<input type="submit" style="width:80px;" value="新規登録">
								</td>
							</form>
							<form method="POST" action="dailyreport_list.php">
									
								<td>
									<input type="submit" style="width:80px;" value="一覧へ戻る">
								</td>
							</form>
							</tr>
						</table>
						<table bgcolor="#a9a9a9" cellspacing="1px" style="font-size:12px;" >
							<tr bgcolor="#D3D3D3" style="height:24px;" align="center">
								<td width="70">部署名</td>
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
								<td>
									<select name="set_sectionCode" onchange="submit(this.form)" style="width:100px;">
										<option value="{$set_sectionCode}" selected>{$sectionName}
										{$opt_section}
									</select>
								</td>
							</form>
								<td width="70">担当者</td>
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
								<td>
									<select name="set_staffCode" onchange="submit(this.form)" style="width:100px;">
										<option value="{$set_staffCode}" selected>{$staffName}
										{$opt_staff}
									</select>
								</td>
							</form>
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
								<td width="70">作業分類</td>
								<td>
									<select name="set_class" onchange="submit(this.form)" style="width:100px;">
										<option value="{$set_class}" selected>{$set_class_display}
										<option value="1">得意先訪問
										<option value="2">社内作業
									</select>
								</td>
							</form>
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
								<td width="70">実施日</td>
								<td>
									<select name="set_workDate" onchange="submit(this.form)" style="width:100px;">
										<option value="{$set_workDate}" selected>{$set_workDate}
										{$opt_date}
									</select>
								</td>
							</form>
							</tr>
						</table>
						EOD;
						
						//顧客訪問の場合得意先検索画面を表示をする
						if($set_class == 1 and strlen($set_workDate)){   
						echo <<<EOD
						<table bgcolor="#a9a9a9" cellspacing="1px" style="table-layout:fixed;font-size:12px;margin-top:-1px;" >
							<tr bgcolor="#D3D3D3" style="height:24px;" align="center">
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
								<td width="70">得意先</td>
								<td width="286"><input type="text" name="select_customerName" style="width:278px;" value="{$select_customerName}"></td>
								<td width="60"><input type="submit" value="検索" style="width:100%;"></td>
							</form>
						EOD;

							if(strlen($set_customerCode)){
						//得意先が選択された場合面談者を表示
						echo <<<EOD
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
									<input type="hidden" name="fnc" value="1">
									<input type="hidden" name="set_id" value="{$set_id}">
								<td width="70">面談者</td>
								<td width="203"><input type="text" name="set_interviewer" style="width:192px;" value="{$set_interviewer}"></td>

						EOD;
							}
						echo <<<EOD
							</tr>
						</table>
						EOD;

						//得意先検索された場合候補先を表示(社内作業時は表示させない)
							if($set_class == 1 and strlen($select_customerName) and empty($set_customerCode)){	   
						echo <<<EOD
						<table bgcolor="#a9a9a9" cellspacing="1px" style="font-size:12px;margin-top:-1px;" >
							<tr bgcolor="#D3D3D3" style="height:24px;" align="center">
								<td width="359">得意先名</td><td width="60">選択</td>
							</tr>
						EOD;
								$sql = "SELECT customerCode
												,customerName 
										FROM Mcustomer 
										WHERE customerName LIKE '%$select_customerName%';";
								$res = mysqli_query($conn,$sql) or die("error $sql");
								while($row = mysqli_fetch_array($res)){
									$customerCode = $row["customerCode"];
									$customerName = $row["customerName"];
						echo <<<EOD
							 <tr bgcolor="white" style="height:24px;" align="center">
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
									<input type="hidden" name="select_customerName" value="{$customerName}">
									<input type="hidden" name="set_customerCode" value="{$customerCode}">
								<td width="253" bgcolor="white" align="left">{$customerName}</td>
								<td width="60"><input type="submit" value="選択" style="width:100%;"></td>
							</form>
						EOD;
								}
						echo <<<EOD
								</tr>
						</table>
						EOD;
							}
						}
						
						//作業内容登録表示
						if($set_class == 2 or ($set_class == 1 and strlen($set_customerCode))){
						echo <<<EOD
						<table bgcolor="#a9a9a9" cellspacing="1px" style="font-size:12px;margin-top:-1px;" >
							<tr bgcolor="#D3D3D3">
						EOD;
							if($set_class <> 1 ){	//社内作業用のPOSTデータ
						echo <<<EOD
							<form method="POST" action="{$_SERVER['PHP_SELF']}">
									{$OPT_DATA}
									<input type="hidden" name="fnc" value="1">
									<input type="hidden" name="set_id" value="{$set_id}">
						EOD;
							}
						echo <<<EOD
								<td width="70" align="center">内容</td>
								<td width="628">
									<textarea type="text" name="set_comment" rows="20" cols="86">{$set_comment}</textarea>
								</td>
							</tr>
						</table>
						<table>
							<tr>
								<td width="635"></td>
								<td width="60">
									<input type="submit" style="width:60px;" value="{$btn}">
								</td>
							</form>
							</tr>
						</table>
						EOD;
						}
						echo <<<EOD
						</body>
						</html>
						EOD;
						
						?>
						
<解説>
76行目
$workMonth = date("Ym",strtotime($workDate));
これは日付YYYY-MM-DDを年月YYYYMMとして変換してます。date関数は指定した日付を呼び出せます。
date("Y-m-d"); これは本日日付、例)2023-08-05として呼出します。
date("Y-m-01"); 2023-08-01と01指定の2023-08-01
<主な時刻フォーマット>
YYYYY 4桁yYY 2桁
mMM 2桁n先頭にゼロ無
dDD 4桁j先頭にゼロ無
曜日DMon~Sun 3文字w0(日曜)~ 6(土曜)
H00~23 2桁G0~23
i00~59
s00~59
なぜこの変換を行っているかというと年月単位で訪問件数を集計が簡単となります。
どのように簡単になるかは集計のページにて解説します。

142行目~170行目
修正データ抽出(登録直後および一覧からの修正を$set_idの有無で判定し抽出)します。

230行目~233行目
for文
処理を繰り返すときに使用します。このプログラムの場合、$iの初期値が0で繰り返し処理毎$i++で$iに1が加算されます。この加算が$i <= 10 ($cnt = 10で169行目に定義) まで続けるという処理になります。

265行目
新規登録登録用ボタン

271行目
一覧表示への戻るためのボタン