'Windows 10/11', '/windows nt 6.3/i' => 'Windows 8.1', '/windows nt 6.2/i' => 'Windows 8', '/windows nt 6.1/i' => 'Windows 7', '/windows nt 6.0/i' => 'Windows Vista', '/windows nt 5.2/i' => 'Windows Server 2003/XP x64', '/windows nt 5.1/i' => 'Windows XP', '/windows xp/i' => 'Windows XP', '/windows nt 5.0/i' => 'Windows 2000', '/windows me/i' => 'Windows ME', '/win98/i' => 'Windows 98', '/win95/i' => 'Windows 95', '/win16/i' => 'Windows 3.11', '/macintosh|mac os x/i' => 'Mac OS X', '/mac_powerpc/i' => 'Mac OS 9', '/linux/i' => 'Linux', '/ubuntu/i' => 'Ubuntu', '/iphone/i' => 'iPhone', '/ipod/i' => 'iPod', '/ipad/i' => 'iPad', '/android/i' => 'Android', '/blackberry/i' => 'BlackBerry', '/webos/i' => 'Mobile' ); foreach ($os_array as $regex => $value) { if (preg_match($regex, $user_agent)) { $os_platform = $value; } } return $os_platform; } function getBrowser() { global $user_agent; $browser = "Unknown Browser"; $browser_array = array( '/edg/i' => 'Microsoft Edge', '/msie/i' => 'Internet Explorer', '/firefox/i' => 'Firefox', '/safari/i' => 'Safari', '/chrome/i' => 'Chrome', '/opera/i' => 'Opera', '/netscape/i' => 'Netscape', '/maxthon/i' => 'Maxthon', '/konqueror/i' => 'Konqueror', '/mobile/i' => 'Handheld Browser' ); foreach ($browser_array as $regex => $value) { if (preg_match($regex, $user_agent)) { $browser = $value; } } return $browser; } $user_os = getOS(); $user_browser = getBrowser(); $show_ip = $_SERVER['REMOTE_ADDR']; //$device_details = "Browser: ".$user_browser."
Operating System: ".$user_os.""; //print_r($device_details); //echo("


".$_SERVER['HTTP_USER_AGENT'].""); //--------------------------------------ฟังก์ชันแปลงวันเป็นภาษาไทยแบบเต็ม------------------------------------------------// function thai_date($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."); if ($month < 10) { $month = substr($month, 1, 1); } $year += 543; return $day . " " . $thMonth[$month - 1] . " " . $year; } //---------------------------------ฟังก์ชันแปลงวันเป็นภาษาไทยแบบเต็ม-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงเดือนเป็นภาษาไทยแบบเต็ม------------------------------------------------// function thai_month($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } $year += 543; return $thMonth[$month - 1] . " " . $year; } //---------------------------------ฟังก์ชันแปลงเดือนเป็นภาษาไทยแบบเต็ม-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงวันเป็นภาษาไทย2------------------------------------------------// function thai_date2($date) { list($year, $month, $day) = explode('-', $date); $year += 543; return $day . "-" . $month . "-" . $year; } function thai_date3($date) { list($year, $month, $day) = explode('-', $date); return $day . "-" . $month . "-" . $year; } function thai_date_full($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } $year = $year + 543; return $day . " " . $thMonth[$month - 1] . " พ.ศ. " . $year; } function thai_date5($date) { list($day, $month, $year) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } return $day . " " . $thMonth[$month - 1] . " พ.ศ. " . $year; } function thai_date6($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."); if ($month < 10) { $month = substr($month, 1, 1); } $year = $year + 543; return $day . " " . $thMonth[$month - 1] . " " . $year; } function thai_date7($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } $year = $year + 543; return "วันที่ " . $day . " " . $thMonth[$month - 1] . " พ.ศ. " . $year; } function thai_date8($date) { list($day, $month, $year) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } $thMonth = array("ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."); if ($month < 10) { $month = substr($month, 1, 1); } return $day . " " . $thMonth[$month - 1] . " " . $year; } function novel_date1($date) { list($year, $month, $day) = explode('-', $date); return $day . "/" . $month . "/" . $year; } function thai_date9($date) { list($year, $month, $day) = explode('-', $date); $year += 543; return $day . "/" . $month . "/" . $year; } //---------------------------------ฟังก์ชันแปลงวันเป็นภาษาไทย2-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงวันเป็นรูปแบบของ mysql------------------------------------------------// function mysql_date1($date) { list($day, $month, $year) = explode('-', $date); switch ($month) { case "ม.ค.": $thMonth = "01"; break; case "ก.พ.": $thMonth = "02"; break; case "มี.ค.": $thMonth = "03"; break; case "เม.ย.": $thMonth = "04"; break; case "พ.ค.": $thMonth = "05"; break; case "มิ.ย.": $thMonth = "06"; break; case "ก.ค.": $thMonth = "07"; break; case "ส.ค.": $thMonth = "08"; break; case "ก.ย.": $thMonth = "09"; break; case "ต.ค.": $thMonth = "10"; break; case "พ.ย.": $thMonth = "11"; break; case "ธ.ค.": $thMonth = "12"; break; } $year = $year - 543; return $year . "-" . $thMonth . "-" . $day; } function mysql_date2($date) { list($null, $day, $month, $year) = explode('-', $date); switch ($month) { case "ม.ค.": $thMonth = "01"; break; case "ก.พ.": $thMonth = "02"; break; case "มี.ค.": $thMonth = "03"; break; case "เม.ย.": $thMonth = "04"; break; case "พ.ค.": $thMonth = "05"; break; case "มิ.ย.": $thMonth = "06"; break; case "ก.ค.": $thMonth = "07"; break; case "ส.ค.": $thMonth = "08"; break; case "ก.ย.": $thMonth = "09"; break; case "ต.ค.": $thMonth = "10"; break; case "พ.ย.": $thMonth = "11"; break; case "ธ.ค.": $thMonth = "12"; break; } $year = $year - 543; return $year . "-" . $thMonth . "-" . $day; } function mysql_date3($date) { @list($day, $month, $year) = @explode('-', $date); return $year . "-" . $month . "-" . $day; } //--------------------------------ฟังก์ชันแปลงวันเป็นรูปแบบของ mysql------------------------------------------------------// //--------------------------------------ฟังก์ชันแบ่งช่วงของวัน------------------------------------------------// function explode_date1($date) { list($date1, $date2) = explode('-', $date); return mysql_date1($date1); } function explode_date2($date) { list($date1, $date2) = explode('-', $date); $new_date2 = mysql_date2($date2); if ($new_date2 == "-543--") { echo ""; } else { return $new_date2; } } //---------------------------------ฟังก์ชันแบ่งช่วงของวัน-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงวันเป็นรูปแบบเลขที่ใบสมัคร------------------------------------------------// function code_date($date) { list($year, $month, $day) = explode('-', $date); $Month = $month; $year += 543; $sYear = substr($year, 2, 2); return $sYear . $day . $Month; } //---------------------------------ฟังก์ชันแปลงวันเป็นรูปแบบเลขที่ใบสมัคร-----------------------------------------------------// //--------------------------------------ฟังก์ชันแยกชื่อ-นามสกุลไฟล์------------------------------------------------// function explode_filename($filename) { list($name, $ext) = explode('.', $filename); return $name; } function explode_extname($filename) { list($name, $ext) = explode('.', $filename); return $ext; } //---------------------------------ฟังก์ชันแยกชื่อ-นามสกุลไฟล์-----------------------------------------------------// //--------------------------------------ฟังก์ชันแบ่งชื่อ------------------------------------------------// function split_fname($name) { list($fname, $lname) = explode(' ', $name); return $fname; } function split_lname($name) { list($fname, $lname) = explode(' ', $name); return $lname; } //---------------------------------ฟังก์ชันแบ่งชื่อ-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงวันเวลาเป็นวัน------------------------------------------------// function datetime_to_date($date) { list($date1, $time) = explode(' ', $date); list($year, $month, $day) = explode('-', $date1); $year += 543; return $day . "-" . $month . "-" . $year; } function datetime_to_date2($date) { list($date1, $time) = explode('-', $date); return $date1; } //---------------------------------ฟังก์ชันแปลงวันเวลาเป็นวัน-----------------------------------------------------// //--------------------------------------ฟังก์ชันแปลงวันเวลาเป็นเวลา------------------------------------------------// function datetime_to_time($date) { list($date1, $time) = explode(' ', $date); list($hh, $mm, $ss) = explode(':', $time); return $hh . ":" . $mm; } //---------------------------------ฟังก์ชันแปลงวันเวลาเป็นเวลา-----------------------------------------------------// //------------------------ตัดคำ----------------------------------------------------// //------------------------------ฟังก์ชั่นตั้งชื่อไฟล์จากวันเวลา------------------------------------------------// function gen_filename($date) { list($date1, $time) = explode(' ', $date); list($year, $month, $day) = explode('-', $date1); list($hh, $mm, $ss) = explode(':', $time); $year += 543; $year2 = substr($year, 2, 2); return $year2 . "" . $month . "" . $day . "" . $hh . "" . $mm . "" . $ss; } //---------------------------------ฟังก์ชันแปลงวันเวลาเป็นเวลา-----------------------------------------------------// //------------------------ตัดคำ----------------------------------------------------// function cutStr($str, $maxChars = '', $holder = '') { if (strlen($str) > $maxChars) { $str = iconv_substr($str, 0, $maxChars, "UTF-8") . $holder; } return $str; } //--------------------------------------ฟังก์ชันแยกเดือน-ปี------------------------------------------------// function showDate($today) { list($year, $month, $date) = explode('-', $today); return $date; } function showDate2($today) { list($year, $month, $date) = explode('-', $today); return $date; } function showMonth($today) { list($year, $month, $date) = explode('-', $today); return $month; } function showMonth2($today) { list($year, $month, $date) = explode('-', $today); return $month; } function showYear($today, $date) { list($year, $month, $date) = explode('-', $today); return $year; } function showYear2($today, $date) { list($year, $month, $date) = explode('-', $today); return $year; } function showAll($today) { list($year, $month, $date) = explode('-', $today); $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } $year += 543; return $thMonth[$month - 1] . " พ.ศ. " . $year; } function showAll2($today) { list($year, $month, $date) = explode('-', $today); $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } $year += 543; return $date . " " . $thMonth[$month - 1] . " พ.ศ. " . $year; } function typeFile($name) { list($f, $l) = explode('.', $name); return $l; } //--------------------------------------ฟังก์ชันแยกเดือน-ปี------------------------------------------------// //--------------------------------------ฟังก์ชันแยกชื่อ-นามสกุล------------------------------------------------// function explode_fname($data) { list($fname, $lname) = explode(' ', $data); return $fname; } function explode_lname($data) { list($fname, $lname) = explode(' ', $data); return $lname; } //---------------------------------ฟังก์ชันแยกชื่อ-นามสกุล-----------------------------------------------------// //------------------ วันนี้ แยก วัน เดือน ปี ------------------------------------- function today_date($date) { list($year, $month, $day) = explode('-', $date); if ($day < 10) { $day = substr($day, 1, 1); } return $day; } function today_month($date) { list($year, $month, $day) = explode('-', $date); $thMonth = array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"); if ($month < 10) { $month = substr($month, 1, 1); } return $thMonth[$month - 1]; } function today_year($date) { list($year, $month, $day) = explode('-', $date); $year = $year + 543; return $year; } //--------------------------------------ฟังก์ชันเข้ารหัสและถอดรหัส (URL Security)------------------------------------------------// function encrypt_param($data) { if (empty($data)) return ''; $method = 'AES-256-CBC'; $key = defined('APP_KEY') ? APP_KEY : 'default_fallback_key_2026'; $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method)); $encrypted = openssl_encrypt($data, $method, $key, 0, $iv); // Combine IV (base64) and Encrypted payload (base64) to avoid binary concatenation issues $payload = base64_encode($iv) . '::' . $encrypted; // Use Base64URL to prevent +, /, and = from breaking in GET/POST requests return rtrim(strtr(base64_encode($payload), '+/', '-_'), '='); } function decrypt_param($data) { if (empty($data)) return ''; $method = 'AES-256-CBC'; $key = defined('APP_KEY') ? APP_KEY : 'default_fallback_key_2026'; // Decode Base64URL back to standard Base64 $b64 = str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT); $decoded = base64_decode($b64); if (strpos($decoded, '::') === false) { // Fallback for legacy base64-only data to prevent breaking existing bookmarked links during transition return base64_decode($data); // Fallback to raw base64 decode if it was an old link } list($iv_b64, $encrypted) = explode('::', $decoded, 2); $iv = base64_decode($iv_b64); return openssl_decrypt($encrypted, $method, $key, 0, $iv); } //--------------------------------------ฟังก์ชันตรวจสอบสิทธิ์แอดมิน------------------------------------------------// function is_admin($username) { global $conn2; if (!$conn2 || empty($username)) return false; // Auto-create sys_admins table $create_sql = "CREATE TABLE IF NOT EXISTS sys_admins ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, granted_by VARCHAR(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"; $conn2->query($create_sql); // Check total admins (Bootstrap logic) $res_count = $conn2->query("SELECT COUNT(*) AS total FROM sys_admins"); if ($res_count) { $row = $res_count->fetch_assoc(); if ($row['total'] == 0) { // No admins exist yet, allow everyone so they can set themselves as admin return true; } } // Check if user is admin $sql = "SELECT id FROM sys_admins WHERE username = ?"; $stmt = $conn2->prepare($sql); if ($stmt) { $stmt->bind_param("s", $username); $stmt->execute(); $res = $stmt->get_result(); $is_admin = ($res->num_rows > 0); $stmt->close(); $stmt->close(); return $is_admin; } return false; } //--------------------------------------ฟังก์ชันตรวจสอบสิทธิ์การค้นหาด้วยชื่อ------------------------------------------------// function can_search_name($username) { global $conn2; if (!$conn2 || empty($username)) return false; // Auto-create sys_user_permissions table $create_sql = "CREATE TABLE IF NOT EXISTS sys_user_permissions ( username VARCHAR(255) PRIMARY KEY, can_search_name TINYINT(1) DEFAULT 0, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, updated_by VARCHAR(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"; $conn2->query($create_sql); // If user is admin, they can do anything if (is_admin($username)) return true; // Check specific permission $sql = "SELECT can_search_name FROM sys_user_permissions WHERE username = ? AND can_search_name = 1"; $stmt = $conn2->prepare($sql); if ($stmt) { $stmt->bind_param("s", $username); $stmt->execute(); $res = $stmt->get_result(); $has_permission = ($res->num_rows > 0); $stmt->close(); return $has_permission; } return false; } //--------------------------------------ฟังก์ชันเก็บประวัติการใช้งานระบบ (System Audit Logs)------------------------------------------------// function system_log($conn, $username, $action, $details = null) { if (!$conn) return false; try { // Auto-create table if not exists (safe to run, minimal overhead if table exists) $create_sql = "CREATE TABLE IF NOT EXISTS sys_audit_logs ( id INT AUTO_INCREMENT PRIMARY KEY, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, username VARCHAR(255) NOT NULL, action VARCHAR(50) NOT NULL, details TEXT, ip_address VARCHAR(45), user_agent TEXT, INDEX idx_action (action), INDEX idx_username (username), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"; $conn->query($create_sql); $ip_address = $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN'; $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? 'UNKNOWN'; $details_json = is_array($details) ? json_encode($details, JSON_UNESCAPED_UNICODE) : $details; $sql = "INSERT INTO sys_audit_logs (username, action, details, ip_address, user_agent) VALUES (?, ?, ?, ?, ?)"; $stmt = $conn->prepare($sql); if ($stmt) { $stmt->bind_param("sssss", $username, $action, $details_json, $ip_address, $user_agent); $result = $stmt->execute(); $stmt->close(); return $result; } } catch (Throwable $e) { error_log("system_log Error: " . $e->getMessage()); } return false; } // Helper function to loosely determine abnormal labs function isAbnormalLab($result, $normal) { if (empty($result) || empty($normal) || $normal == '-') return false; $resStr = strtolower(trim($result)); $normStr = strtolower(trim($normal)); // Keyword check if (in_array($resStr, ['positive', 'reactive', 'detected'])) { if (strpos($normStr, 'negative') !== false || strpos($normStr, 'non-reactive') !== false || strpos($normStr, 'undetected') !== false) { return true; } } // Numeric check preg_match('/^[-+]?[0-9]*\.?[0-9]+/', $result, $resMatch); if (!empty($resMatch)) { $val = (float)$resMatch[0]; // Fix: Replace dashes between numbers with " to " so they aren't parsed as negative signs $normal_parsed = preg_replace('/(\d)\s*-\s*(\d)/', '$1 to $2', $normal); preg_match_all('/[-+]?[0-9]*\.?[0-9]+/', $normal_parsed, $normMatches); if (!empty($normMatches[0])) { $numbers = $normMatches[0]; // Since we replaced '-', check for "to" or '-' in original if (count($numbers) == 2 && (strpos($normal, '-') !== false || strpos($normal_parsed, 'to') !== false) && !preg_match('/[ชญ]/u', $normal)) { if ($val < (float)$numbers[0] || $val > (float)$numbers[1]) return true; } else if (count($numbers) >= 4 && preg_match('/[ชญ]/u', $normal)) { $min1 = min((float)$numbers[0], (float)$numbers[2]); $max1 = max((float)$numbers[1], (float)$numbers[3]); if ($val < $min1 || $val > $max1) return true; } else if (strpos($normal, '<') !== false && count($numbers) >= 1) { preg_match('/<\s*([0-9.]+)/', $normal, $ltMatch); if (!empty($ltMatch) && $val >= (float)$ltMatch[1]) return true; // changed to >= if normal is < X, then X is abnormal } else if (strpos($normal, '>') !== false && count($numbers) >= 1) { preg_match('/>\s*([0-9.]+)/', $normal, $gtMatch); if (!empty($gtMatch) && $val <= (float)$gtMatch[1]) return true; // changed to <= if normal is > X, then X is abnormal } } } return false; } ?>