false, 'error' => 'Payload JSON tidak valid.']); exit; } // Ambil parameter $dbType = trim($data['dbType'] ?? 'mysql'); $host = trim($data['dbHost'] ?? 'localhost'); $port = trim($data['dbPort'] ?? ''); $dbName = trim($data['dbName'] ?? ''); $user = trim($data['dbUser'] ?? ''); $pass = $data['dbPass'] ?? ''; $sqlitePath = trim($data['dbSqlitePath'] ?? 'database.sqlite'); // Validasi dasar if ($dbType !== 'sqlite' && empty($dbName)) { echo json_encode(['success' => false, 'error' => 'Nama database wajib diisi.']); exit; } if ($dbType === 'sqlite' && empty($sqlitePath)) { echo json_encode(['success' => false, 'error' => 'Path file SQLite wajib diisi.']); exit; } if ($dbType !== 'sqlite' && empty($user)) { echo json_encode(['success' => false, 'error' => 'Username wajib diisi.']); exit; } // Cek ekstensi PDO if (!extension_loaded('pdo')) { echo json_encode(['success' => false, 'error' => 'Ekstensi PDO tidak tersedia di server.']); exit; } $dsn = ''; $driver = ''; try { switch ($dbType) { case 'mysql': if (!extension_loaded('pdo_mysql')) { throw new Exception('Driver PDO MySQL tidak tersedia.'); } $driver = 'MySQL'; $port = $port ?: '3306'; $dsn = "mysql:host={$host};port={$port};dbname={$dbName};charset=utf8mb4"; break; case 'pgsql': if (!extension_loaded('pdo_pgsql')) { throw new Exception('Driver PDO PostgreSQL tidak tersedia.'); } $driver = 'PostgreSQL'; $port = $port ?: '5432'; $dsn = "pgsql:host={$host};port={$port};dbname={$dbName};options='--client_encoding=UTF8'"; break; case 'sqlite': if (!extension_loaded('pdo_sqlite')) { throw new Exception('Driver PDO SQLite tidak tersedia.'); } $driver = 'SQLite'; $dir = dirname($sqlitePath); if (!is_dir($dir) && $dir !== '.') { mkdir($dir, 0755, true); } $dsn = "sqlite:{$sqlitePath}"; break; default: echo json_encode(['success' => false, 'error' => 'Jenis database tidak didukung.']); exit; } // Buat koneksi PDO $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_TIMEOUT => 5, ]; if ($dbType === 'sqlite') { $pdo = new PDO($dsn, null, null, $options); } else { $pdo = new PDO($dsn, $user, $pass, $options); } // Ambil versi $version = 'unknown'; if ($dbType === 'mysql') { $stmt = $pdo->query('SELECT VERSION() AS ver'); $row = $stmt->fetch(); $version = $row['ver'] ?? 'unknown'; } elseif ($dbType === 'pgsql') { $stmt = $pdo->query('SELECT VERSION() AS ver'); $row = $stmt->fetch(); $version = $row['ver'] ?? 'unknown'; } elseif ($dbType === 'sqlite') { $stmt = $pdo->query('SELECT sqlite_version() AS ver'); $row = $stmt->fetch(); $version = $row['ver'] ?? 'unknown'; } $serverInfo = $pdo->getAttribute(PDO::ATTR_SERVER_INFO) ?: 'N/A'; if ($dbType === 'sqlite') { $serverInfo = 'SQLite ' . $version; } echo json_encode([ 'success' => true, 'driver' => $driver, 'version' => $version, 'serverInfo' => $serverInfo, 'dsn' => $dsn, 'database' => $dbType === 'sqlite' ? $sqlitePath : $dbName, 'host' => $dbType === 'sqlite' ? '—' : $host, 'port' => $dbType === 'sqlite' ? '—' : $port, 'user' => $dbType === 'sqlite' ? '—' : $user, ]); exit; } catch (PDOException $e) { $errorMsg = $e->getMessage(); $safeDsn = preg_replace('/password=[^;]+/i', 'password=****', $dsn); echo json_encode([ 'success' => false, 'error' => $errorMsg, 'dsn' => $safeDsn, 'driver' => $driver ?? 'unknown', ]); exit; } catch (Exception $e) { echo json_encode([ 'success' => false, 'error' => $e->getMessage(), ]); exit; } } // ============================================================ // FRONTEND - Tampilkan HTML jika bukan POST // ============================================================ ?>