<学習する内容>
複数テーブル、複数プログラムを使ったプログラムの作成を経験します
本ページでは設計と登録画面を作成します。
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
配置先URL:
http://localhost/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
<主な時刻フォーマット>
年 | Y | YYYY 4桁 | y | YY 2桁 |
月 | m | MM 2桁 | n | 先頭にゼロ無 |
日 | d | DD 4桁 | j | 先頭にゼロ無 |
曜日 | D | Mon~Sun 3文字 | w | 0(日曜)~ 6(土曜) |
時 | H | 00~23 2桁 | G | 0~23 |
分 | i | 00~59 | | |
秒 | s | 00~59 | | |
なぜこの変換を行っているかというと年月単位で訪問件数を集計が簡単となります。
どのように簡単になるかは集計のページにて解説します。
142行目~170行目
修正データ抽出(登録直後および一覧からの修正を$set_idの有無で判定し抽出)します。
230行目~233行目
for文
処理を繰り返すときに使用します。このプログラムの場合、$iの初期値が0で繰り返し処理毎$i++で$iに1が加算されます。この加算が$i <= 10 ($cnt = 10で169行目に定義)
まで続けるという処理になります。
265行目
新規登録登録用ボタン
271行目
一覧表示への戻るためのボタン