From b3d680cf667fd162665ee45d46f25ed1c7219526 Mon Sep 17 00:00:00 2001 From: Nayyara0412 Date: Thu, 11 Jun 2026 14:54:40 +0700 Subject: [PATCH] Make database bootstrap robust for Docker deployment --- webgis01/koneksi.php | 34 +++++++++++++++++------ webgis02/config.php | 65 ++++++++++++++++++++++++++++++++++++++------ webgis04/koneksi.php | 34 +++++++++++++++++------ 3 files changed, 109 insertions(+), 24 deletions(-) diff --git a/webgis01/koneksi.php b/webgis01/koneksi.php index 1bdcf95..ec8bbfc 100644 --- a/webgis01/koneksi.php +++ b/webgis01/koneksi.php @@ -9,29 +9,47 @@ function env_first(array $keys, $default = '') { return $default; } +function connect_server(array $hosts, string $user, string $pass) { + foreach ($hosts as $host) { + $conn = @mysqli_connect($host, $user, $pass); + if ($conn) return $conn; + } + return false; +} + $hosts = array_filter(array_unique([ env_first(['DB_HOST', 'MYSQL_HOST', 'MARIADB_HOST']), + 'database', 'mysql', 'mariadb', 'db', - 'database', 'host.docker.internal', '127.0.0.1', ])); $user = env_first(['DB_USER', 'MYSQL_USER', 'MARIADB_USER'], 'root'); $pass = env_first(['DB_PASSWORD', 'MYSQL_PASSWORD', 'MARIADB_PASSWORD'], ''); -$db = env_first(['SPBU_DB_NAME', 'DB_NAME_SPBU', 'DB_NAME', 'MYSQL_DATABASE', 'MARIADB_DATABASE'], 'db_spbu'); +$db = env_first(['SPBU_DB_NAME', 'DB_NAME_SPBU'], 'db_spbu'); -$conn = false; -foreach ($hosts as $host) { - $conn = mysqli_connect($host, $user, $pass, $db); - if ($conn) break; -} +$conn = connect_server($hosts, $user, $pass); if (!$conn) { - die("Koneksi database gagal. Pastikan MySQL service berjalan, environment DB_HOST/DB_USER/DB_PASSWORD benar, dan database '$db' sudah diimport. Error: " . mysqli_connect_error()); + die("Koneksi database gagal. Pastikan MySQL service berjalan dan DB_HOST/DB_USER/DB_PASSWORD benar. Error: " . mysqli_connect_error()); } mysqli_set_charset($conn, 'utf8mb4'); + +$safeDb = preg_replace('/[^a-zA-Z0-9_]/', '', $db); +mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `$safeDb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); +mysqli_select_db($conn, $safeDb); + +mysqli_query($conn, "CREATE TABLE IF NOT EXISTS spbu ( + id INT(11) NOT NULL AUTO_INCREMENT, + nama_spbu VARCHAR(100) NOT NULL, + no_wa VARCHAR(20) NOT NULL, + status ENUM('yes','no') NOT NULL DEFAULT 'no', + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); ?> diff --git a/webgis02/config.php b/webgis02/config.php index f84b314..d95b00d 100644 --- a/webgis02/config.php +++ b/webgis02/config.php @@ -9,35 +9,84 @@ function env_first(array $keys, $default = '') { return $default; } +function connect_server(array $hosts, string $user, string $pass) { + foreach ($hosts as $host) { + $conn = @mysqli_connect($host, $user, $pass); + if ($conn) return $conn; + } + return false; +} + $hosts = array_filter(array_unique([ env_first(['DB_HOST', 'MYSQL_HOST', 'MARIADB_HOST']), + 'database', 'mysql', 'mariadb', 'db', - 'database', 'host.docker.internal', '127.0.0.1', ])); $user = env_first(['DB_USER', 'MYSQL_USER', 'MARIADB_USER'], 'root'); $pass = env_first(['DB_PASSWORD', 'MYSQL_PASSWORD', 'MARIADB_PASSWORD'], ''); -$db = env_first(['WEBGIS02_DB_NAME', 'DB_NAME_WEBGIS02', 'DB_NAME', 'MYSQL_DATABASE', 'MARIADB_DATABASE'], 'webgis_db'); +$db = env_first(['WEBGIS02_DB_NAME', 'DB_NAME_WEBGIS02'], 'webgis_db'); -$conn = false; -foreach ($hosts as $host) { - $conn = mysqli_connect($host, $user, $pass, $db); - if ($conn) break; -} +$conn = connect_server($hosts, $user, $pass); if (!$conn) { die(json_encode([ 'status' => 'error', - 'message' => "Koneksi database gagal. Pastikan MySQL service berjalan, environment DB_HOST/DB_USER/DB_PASSWORD benar, dan database '$db' sudah diimport. Error: " . mysqli_connect_error() + 'message' => 'Koneksi database gagal. Pastikan MySQL service berjalan dan DB_HOST/DB_USER/DB_PASSWORD benar. Error: ' . mysqli_connect_error() ])); } mysqli_set_charset($conn, 'utf8mb4'); +$safeDb = preg_replace('/[^a-zA-Z0-9_]/', '', $db); +mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `$safeDb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); +mysqli_select_db($conn, $safeDb); + +mysqli_query($conn, "CREATE TABLE IF NOT EXISTS tb_jalan ( + id INT(11) NOT NULL AUTO_INCREMENT, + nama_jalan VARCHAR(200) NOT NULL, + status_jalan ENUM('Nasional','Provinsi','Kabupaten') NOT NULL DEFAULT 'Kabupaten', + panjang_meter DECIMAL(15,2) NOT NULL DEFAULT 0, + geojson LONGTEXT NOT NULL, + keterangan TEXT, + foto VARCHAR(255) NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); + +mysqli_query($conn, "CREATE TABLE IF NOT EXISTS tb_parsil ( + id INT(11) NOT NULL AUTO_INCREMENT, + nama_pemilik VARCHAR(200) NOT NULL, + no_sertifikat VARCHAR(100) NOT NULL, + status_kepemilikan ENUM('SHM','HGB','HGU','HP') NOT NULL DEFAULT 'SHM', + luas_m2 DECIMAL(20,4) NOT NULL DEFAULT 0, + geojson LONGTEXT NOT NULL, + alamat TEXT, + foto VARCHAR(255) NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); + +mysqli_query($conn, "CREATE TABLE IF NOT EXISTS tb_jalan_rusak ( + id INT(11) NOT NULL AUTO_INCREMENT, + lokasi VARCHAR(200) NOT NULL, + tingkat ENUM('Ringan','Sedang','Berat') NOT NULL DEFAULT 'Sedang', + jenis VARCHAR(100) NOT NULL DEFAULT '', + geojson LONGTEXT NOT NULL, + keterangan TEXT, + foto VARCHAR(255) NULL, + tanggal_lapor DATE NOT NULL DEFAULT (CURRENT_DATE), + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); + header('Content-Type: application/json'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); diff --git a/webgis04/koneksi.php b/webgis04/koneksi.php index 1bdcf95..ec8bbfc 100644 --- a/webgis04/koneksi.php +++ b/webgis04/koneksi.php @@ -9,29 +9,47 @@ function env_first(array $keys, $default = '') { return $default; } +function connect_server(array $hosts, string $user, string $pass) { + foreach ($hosts as $host) { + $conn = @mysqli_connect($host, $user, $pass); + if ($conn) return $conn; + } + return false; +} + $hosts = array_filter(array_unique([ env_first(['DB_HOST', 'MYSQL_HOST', 'MARIADB_HOST']), + 'database', 'mysql', 'mariadb', 'db', - 'database', 'host.docker.internal', '127.0.0.1', ])); $user = env_first(['DB_USER', 'MYSQL_USER', 'MARIADB_USER'], 'root'); $pass = env_first(['DB_PASSWORD', 'MYSQL_PASSWORD', 'MARIADB_PASSWORD'], ''); -$db = env_first(['SPBU_DB_NAME', 'DB_NAME_SPBU', 'DB_NAME', 'MYSQL_DATABASE', 'MARIADB_DATABASE'], 'db_spbu'); +$db = env_first(['SPBU_DB_NAME', 'DB_NAME_SPBU'], 'db_spbu'); -$conn = false; -foreach ($hosts as $host) { - $conn = mysqli_connect($host, $user, $pass, $db); - if ($conn) break; -} +$conn = connect_server($hosts, $user, $pass); if (!$conn) { - die("Koneksi database gagal. Pastikan MySQL service berjalan, environment DB_HOST/DB_USER/DB_PASSWORD benar, dan database '$db' sudah diimport. Error: " . mysqli_connect_error()); + die("Koneksi database gagal. Pastikan MySQL service berjalan dan DB_HOST/DB_USER/DB_PASSWORD benar. Error: " . mysqli_connect_error()); } mysqli_set_charset($conn, 'utf8mb4'); + +$safeDb = preg_replace('/[^a-zA-Z0-9_]/', '', $db); +mysqli_query($conn, "CREATE DATABASE IF NOT EXISTS `$safeDb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); +mysqli_select_db($conn, $safeDb); + +mysqli_query($conn, "CREATE TABLE IF NOT EXISTS spbu ( + id INT(11) NOT NULL AUTO_INCREMENT, + nama_spbu VARCHAR(100) NOT NULL, + no_wa VARCHAR(20) NOT NULL, + status ENUM('yes','no') NOT NULL DEFAULT 'no', + latitude DOUBLE NOT NULL, + longitude DOUBLE NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); ?>