PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; // ---------- 対象月設定 ---------- // デフォルト:先月(例: 実行日が2月なら、対象月は1月) $targetMonth = isset($_GET['month']) ? $_GET['month'] : date('Y-m', strtotime('first day of last month')); // 比較・表示用日付計算 // 1. レポート対象月 (例: 2025-12) -> 実績を表示 $monthCurrent = $targetMonth; // 2. その前月 (例: 2025-11) -> 比較用 $monthPrev = date('Y-m', strtotime($targetMonth . ' -1 month')); // 3. その翌月 (例: 2026-01) -> 予定を表示 $monthNext = date('Y-m', strtotime($targetMonth . ' +1 month')); // 表示用ラベル $labelThisMonth = date('Y年n月', strtotime($targetMonth . '-01')); $labelPrevMonth = date('Y年n月', strtotime($targetMonth . ' -1 month')); $labelNextMonth = date('Y年n月', strtotime($targetMonth . ' +1 month')); // SQL検索用に年と月を分割(追加項目用) $dateObj = DateTime::createFromFormat('Y-m-d', $targetMonth . '-01'); $targetYear = $dateObj->format('Y'); $targetMonthNum = $dateObj->format('n'); // ---------- 表示対象企業(順番固定) ---------- $displayCompanies = [ '株式会社フレスコ', '三菱地所ホーム', 'OPEC', 'GENERAL', '太平ハウス・ラボ', 'ジャーブネット', 'あさひハウジングセンター', '住友不動産ハウジング', 'イエタス', 'ワンズ・サポート・システム', 'ITC', '旭化成建材', 'WIT', '福工房', '株式会社高砂建設', '京阪電鉄不動産', 'よかタウン', '篠原商店' ]; // ---------- 企業ID → 企業名(ログイン用) ---------- $companyMap = [ 'Fresco'=>'株式会社フレスコ', 'MJHOME'=>'三菱地所ホーム', 'OPEC'=>'OPEC', 'GENERAL'=>'GENERAL', 'houselabo'=>'太平ハウス・ラボ', 'JAHBnet'=>'ジャーブネット', 'AHC'=>'あさひハウジングセンター', 'Sumitomo-rd'=>'住友不動産ハウジング', 'YETUS'=>'イエタス', 'ONESNET'=>'ワンズ・サポート・システム', 'ITC'=>'ITC', 'AKK'=>'旭化成建材', 'WI-TOKYO'=>'WIT', 'fukukobo'=>'福工房', 'takasago'=>'株式会社高砂建設', 'KEIHAN'=>'京阪電鉄不動産', 'yoka-town'=>'よかタウン', 'SHINOHARA'=>'篠原商店' ]; // ---------- 初期化 ---------- // 追加項目のデフォルト値 $serverDisk = '取得なし'; $responseSpeed = '取得なし'; $sslDate = '取得なし'; $virusCount = 0; $ipsCount = 0; // 作業ログ用配列 $workHistory = []; // 実績 $workPlan = []; // 予定 // GAチャート用 $chartData = [ 'Resolution'=>['labels'=>[], 'data'=>[]], 'Browser'=>['labels'=>[], 'data'=>[]], 'OS'=>['labels'=>[], 'data'=>[]], ]; $limits = ['Resolution'=>8,'Browser'=>5,'OS'=>5]; try { $pdo = new PDO($dsn, $user, $password, $options); // ========================================== // 1. 追加項目の取得 (サーバ・セキュリティ等) // ========================================== // ① サーバ空容量 (server_disk) $stmt = $pdo->prepare("SELECT size FROM server_disk WHERE server = 'dbs' AND year = :y AND month = :m LIMIT 1"); $stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]); $row = $stmt->fetch(); if ($row) { $serverDisk = $row['size']; } // ② レスポンス速度 (response_tbl) $stmt = $pdo->prepare("SELECT response FROM response_tbl WHERE service = 'databank' AND year = :y AND month = :m LIMIT 1"); $stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]); $row = $stmt->fetch(); if ($row) { $responseSpeed = $row['response']; } // ③ SSL証明書期限 (ssl_tbl) $stmt = $pdo->prepare("SELECT ssl_date FROM ssl_tbl WHERE service = 'www.databank-solution.net' LIMIT 1"); $stmt->execute(); $row = $stmt->fetch(); if ($row && !empty($row['ssl_date'])) { $dateStr = str_replace('/', '-', $row['ssl_date']); $timestamp = strtotime($dateStr); if ($timestamp) { $sslDate = date('Y年m月d日', $timestamp); } else { $sslDate = $row['ssl_date']; } } // ④ ウイルス・不正侵入検知 (alert_tbl) $stmt = $pdo->prepare("SELECT kind, alert_count FROM alert_tbl WHERE year = :y AND month = :m AND kind IN ('virus', 'ips')"); $stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]); $alertRows = $stmt->fetchAll(); foreach ($alertRows as $r) { if ($r['kind'] === 'virus') { $virusCount = $r['alert_count']; } elseif ($r['kind'] === 'ips') { $ipsCount = $r['alert_count']; } } // ========================================== // ★追加: 作業ログの取得 // ========================================== // ① 作業実績(対象月 & status=done) $sqlWorkHistory = " SELECT work_date, server_name, work_content FROM server_work_log WHERE work_date LIKE :month AND status = 'done' ORDER BY work_date ASC "; $stmt = $pdo->prepare($sqlWorkHistory); $stmt->execute([':month' => $monthCurrent . '%']); $workHistory = $stmt->fetchAll(); // ② 作業予定(翌月 & status=plan) $sqlWorkPlan = " SELECT work_date, server_name, work_content FROM server_work_log WHERE work_date LIKE :month AND status = 'plan' ORDER BY work_date ASC "; $stmt = $pdo->prepare($sqlWorkPlan); $stmt->execute([':month' => $monthNext . '%']); $workPlan = $stmt->fetchAll(); // ========================================== // 2. ディスク使用量 // ========================================== $monthPrev2 = date('Y-m', strtotime($monthCurrent.' -2 month')); $sqlDisk = " SELECT cur.company_name, (cur.total_size_gb - IFNULL(prev.total_size_gb,0)) AS cur_size, (cur.file_count - IFNULL(prev.file_count,0)) AS cur_files, (prev.total_size_gb - IFNULL(prev2.total_size_gb,0)) AS prev_size, (prev.file_count - IFNULL(prev2.file_count,0)) AS prev_files, cur.total_size_gb AS total_size, cur.file_count AS total_files FROM company_file_usage cur LEFT JOIN company_file_usage prev ON cur.company_id = prev.company_id AND prev.target_month = :m1 LEFT JOIN company_file_usage prev2 ON cur.company_id = prev2.company_id AND prev2.target_month = :m0 WHERE cur.target_month = :m2 "; $stmt = $pdo->prepare($sqlDisk); $stmt->execute([':m0'=>$monthPrev2,':m1'=>$monthPrev,':m2'=>$monthCurrent]); $diskRows = $stmt->fetchAll(); $diskMap = []; foreach ($diskRows as $r) { $diskMap[$r['company_name']] = $r; } // ========================================== // 3. ログイン回数 // ========================================== $sqlLogin = " SELECT company_id, SUM(CASE WHEN target_month=:m1 THEN login_ok_cnt ELSE 0 END) AS cur_ok, SUM(CASE WHEN target_month=:m1 THEN login_ng_cnt ELSE 0 END) AS cur_ng, SUM(CASE WHEN target_month=:m2 THEN login_ok_cnt ELSE 0 END) AS prev_ok, SUM(CASE WHEN target_month=:m2 THEN login_ng_cnt ELSE 0 END) AS prev_ng FROM company_login_stats WHERE target_month IN (:m1,:m2) GROUP BY company_id "; $stmt = $pdo->prepare($sqlLogin); $stmt->execute([':m1'=>$targetMonth,':m2'=>$monthPrev]); $loginRows = $stmt->fetchAll(); $loginMap = []; foreach ($displayCompanies as $companyName) { $loginMap[$companyName] = ['cur_ok'=>0, 'cur_ng'=>0, 'prev_ok'=>0, 'prev_ng'=>0]; } foreach ($loginRows as $r) { if (isset($companyMap[$r['company_id']])) { $cname = $companyMap[$r['company_id']]; $loginMap[$cname] = [ 'cur_ok' => (int)$r['cur_ok'], 'cur_ng' => (int)$r['cur_ng'], 'prev_ok' => (int)$r['prev_ok'], 'prev_ng' => (int)$r['prev_ng'], ]; } } // ========================================== // 4. GA (Google Analytics) // ========================================== $sqlGA = " SELECT category,label,active_users FROM ga4_monthly_report WHERE report_month=:month ORDER BY category,active_users DESC "; $stmt = $pdo->prepare($sqlGA); $stmt->execute([':month'=>$targetMonth]); $gaRows = $stmt->fetchAll(); foreach ($gaRows as $r) { $chartData[$r['category']]['labels'][] = $r['label']; $chartData[$r['category']]['data'][] = $r['active_users']; } foreach ($limits as $k=>$v) { if (isset($chartData[$k])) { $chartData[$k]['labels'] = array_slice($chartData[$k]['labels'],0,$v); $chartData[$k]['data'] = array_slice($chartData[$k]['data'],0,$v); } } } catch (PDOException $e) { exit('DB Error: '.$e->getMessage()); } ?> <?= htmlspecialchars($labelThisMonth) ?> 月報

月報

ディスク使用量

0, 'cur_files'=>0, 'prev_size'=>0, 'prev_files'=>0, 'total_size'=>0, 'total_files'=>0 ]; ?>
企業名 合計
利用量(GB)ファイル数 利用量(GB)ファイル数 利用量(GB)ファイル数

ログイン回数

企業名
成功失敗成功失敗

ユーザ情報

解像度 (Top8)

ブラウザ (Top5)

OS (Top5)

サーバ情報

サーバ空容量 (dbs)

レスポンス速度 (databank)

SSL証明書期限

ウイルス検知

不正侵入検知

作業報告

作業実績

0): ?>
作業日 対象サーバ 作業内容
実績なし

作業予定

0): ?>
予定日 対象サーバ 作業内容
予定なし