index.php
<!DOCTYPE html>
<html>
<head>
<title>社員検索</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(document).ready(function(){
// コンボボックスの内容を設定
var year = new Date().getFullYear();
var month = new Date().getMonth() + 1;
var optionHtml = '';
for(var i = 0; i < 24; i++){
var y = year - Math.floor((month - 1 + i) / 12);
var m = (month + i) % 12;
if(m == 0){
m = 12;
y--;
}
optionHtml += '<option value="' + y + '-' + m.toString().padStart(2, '0') + '">' + y + '年' + m + '月</option>';
}
$('#ym_select').html(optionHtml);
// コンボボックスが変更されたら、選択された年月のデータを取得して反映
$('#ym_select').change(function(){
var ym = $(this).val();
$.post('get_data.php', {ym: ym}, function(data){
$('#empno_select, #dept_select').html('');
$.each(data, function(i, row){
$('#empno_select').append('<option value="' + row.empno + '">' + row.empno + '</option>');
$('#dept_select').append('<option value="' + row.dept + '">' + row.dept + '</option>');
});
}, 'json');
});
// 検索ボタンがクリックされたら、条件にあったデータを取得して反映
$('#search_button').click(function(){
var empno = $('#empno_select').val();
var dept = $('#dept_select').val();
var word = $('#search_word').val();
var ym = $('#ym_select').val();
$.post('search_data.php', {empno: empno, dept: dept, word: word, ym: ym}, function(data){
$('#result_table tbody').html('');
$.each(data, function(i, row){
var html = '<tr>';
html += '<td>' + row.empno + '</td>';
html += '<td>' + row.name + '</td>';
html += '<td>' + row.dept + '</td>';
html += '<td>' + row.age + '</td>';
html += '<td>' + row.salary + '</td>';
html += '</tr>';
$('#result_table tbody').append(html);
});
}, 'json');
});
});
</script>
</head>
<body>
<h1>社員検索</h1>
<label for="ym_select">年月:</label>
<select id="ym_select"></select><br>
<label for="empno_select">社員番号:</label>
<select id="empno_select"></select><br>
<label for="dept_select">所属:</label>
<select id="dept_select"></select><br>
<label for="search_word">検索ワード:</label>
<input type="text" id="search_word"><br>
<button id="search_button">検索</button><br>
<table id="result_table" border="1">
<thead>
<tr>
<th>社員番号</th>
<th>氏名</th>
<th>所属</th>
<th>年齢</th>
<th>給与</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
get_data.php
<?php
// PostgreSQLに接続してデータを取得して一時テーブルを作成する
$dsn = 'pgsql:host=localhost;dbname=mydb';
$user = 'myuser';
$password = 'mypassword';
try{
$dbh = new PDO($dsn, $user, $password);
$ym = $_POST['ym'];
$sql = "SELECT empno, dept FROM mytable WHERE ym = :ym";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':ym', $ym);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$dbh = null;
}catch(PDOException $e){
exit('データベースに接続できませんでした。' . $e->getMessage());
}
// 取得したデータをJSON形式で出力する
header('Content-Type: application/json');
echo json_encode($data);
search_data.php
$dsn = 'pgsql:host=localhost;dbname=mydb';
$user = 'myuser';
$password = 'mypassword';
try{
$dbh = new PDO($dsn, $user, $password);
$empno = $_POST['empno'];
$dept = $_POST['dept'];
$word = $_POST['word'];
$ym = $_POST['ym'];
$sql = "SELECT empno, name, dept, age, salary FROM mytable WHERE ym = :ym";
$params = array(':ym' => $ym);
if($empno != ''){
$sql .= " AND empno = :empno";
$params[':empno'] = $empno;
}
if($dept != ''){
$sql .= " AND dept = :dept";
$params[':dept'] = $dept;
}
if($word != ''){
$sql .= " AND (name LIKE :word OR note LIKE :word)";
$params[':word'] = '%' . $word . '%';
}
$stmt = $dbh->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$dbh = null;
}catch(PDOException $e){
exit('データベースに接続できませんでした。' . $e->getMessage());
}
// 取得したデータをJSON形式で出力する
header('Content-Type: application/json');
echo json_encode($data);
get_yearmonths.js
function getYearMonths(){
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1;
var ym = [];
for(var i = 0; i < 24; i++){
var m = month - i;
var y = year;
if(m <= 0){
m += 12;
y--;
}
if(m < 10){
m = '0' + m;
}
ym.push(y + '-' + m);
}
return ym;
}
// コンボボックスに年月を設定する
function setYearMonthOptions(){
var ym = getYearMonths();
var options = '';
for(var i = 0; i < ym.length; i++){
options += '<option value="' + ym[i] + '">' + ym[i] + '</option>';
}
document.getElementById('ym_select').innerHTML = options;
}
// 社員番号と所属のコンボボックスを設定する
function setEmpnoDeptOptions(data){
var empno_options = '';
var dept_options = '';
for(var i = 0; i < data.length; i++){
var empno = data[i]['empno'];
var dept = data[i]['dept'];
if(empno_options.indexOf(empno) == -1){
empno_options += '<option value="' + empno + '">' + empno + '</option>';
}
if(dept_options.indexOf(dept) == -1){
dept_options += '<option value="' + dept + '">' + dept + '</option>';
}
}
document.getElementById('empno_select').innerHTML = empno_options;
document.getElementById('dept_select').innerHTML = dept_options;
}
// テーブルにデータを反映する
function setResultTable(data){
var table = document.getElementById('result_table');
var tbody = table.getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
for(var i = 0; i < data.length; i++){
var tr = document.createElement('tr');
tr.innerHTML = '<td>' + data[i]['empno'] + '</td>' +
'<td>' + data[i]['name'] + '</td>' +
'<td>' + data[i]['dept'] + '</td>' +
'<td>' + data[i]['age'] + '</td>' +
'<td>' + data[i]['salary'] + '</td>';
tbody.appendChild(tr);
}
}
// コンボボックスの値が変更されたらデータを取得する
function onChangeYearMonth(){
var ym = document.getElementById('ym_select').value;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'get_data.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var data = JSON.parse(xhr.responseText);
set
EmpnoDeptOptions(data);
setResultTable(data);
}
};
xhr.send('ym=' + ym);
}
// 検索ボタンがクリックされたらデータを取得する
function onClickSearch(){
var empno = document.getElementById('empno_select').value;
var dept = document.getElementById('dept_select').value;
var word = document.getElementById('word_input').value;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'get_data.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
var data = JSON.parse(xhr.responseText);
setResultTable(data);
}
};
xhr.send('empno=' + empno + '&dept=' + dept + '&word=' + word);
}
// 初期処理
setYearMonthOptions();
onChangeYearMonth();