&1'; $output = []; $resultCode = 0; exec($command, $output, $resultCode); $joined = trim(implode("\n", $output)); $debugOutput = $output; if ($resultCode !== 0) { $lastError = $joined !== '' ? $joined : ('Fehlercode ' . $resultCode . ' bei ' . $pythonBinary); continue; } $decoded = json_decode($joined, true); if (!is_array($decoded)) { $lastError = $joined !== '' ? 'Python-Ausgabe war kein gültiges JSON.' : 'Python lieferte keine Ausgabe zurück.'; continue; } if (!($decoded['ok'] ?? false)) { return [ 'ok' => false, 'error' => (string)($decoded['error'] ?? 'Unbekannter Python-Fehler'), 'debug' => $joined, ]; } return ['ok' => true, 'data' => $decoded]; } return [ 'ok' => false, 'error' => $lastError, 'debug' => implode("\n", $debugOutput), ]; } $isAjax = isset($_POST['ajax']) && (string)$_POST['ajax'] === '1'; if ($isAjax) { header('Content-Type: application/json; charset=utf-8'); $utcIso = isset($_POST['utc_iso']) ? trim((string)$_POST['utc_iso']) : ''; $timezoneName = isset($_POST['timezone']) ? trim((string)$_POST['timezone']) : 'Europe/Berlin'; if ($utcIso === '') { echo json_encode([ 'ok' => false, 'error' => 'utc_iso wurde nicht übergeben.', ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } $pythonResult = runPythonApi( __DIR__ . '/py/api.py', 'moon_phase_details', [$utcIso, $timezoneName] ); if (!$pythonResult['ok']) { echo json_encode([ 'ok' => false, 'error' => $pythonResult['error'] ?? 'Unbekannter Python-Fehler', 'debug' => $pythonResult['debug'] ?? null, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } echo json_encode($pythonResult['data'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } try { $config = require __DIR__ . '/../config/database.php'; $dsn = sprintf( 'mysql:host=%s;dbname=%s;charset=%s', $config['host'], $config['dbname'], $config['charset'] ?? 'utf8mb4' ); $pdo = new PDO( $dsn, $config['user'], $config['pass'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $stmt = $pdo->query( "SELECT `name`, `type`, `type_de`, `iau_type`, `iau_type_de`, `lati_n`, `lati_c`, `longi_n`, `longi_n_360`, `longi_c`, COALESCE(`wide_km`, `length_km`) AS `diameter_km` FROM `moon_craters` WHERE `name` IS NOT NULL AND `lati_n` IS NOT NULL AND `longi_n` IS NOT NULL ORDER BY COALESCE(`wide_km`, `length_km`) DESC, `name` ASC" ); foreach ($stmt->fetchAll() as $row) { $moonCraterRows[] = [ 'name' => (string)($row['name'] ?? ''), 'type' => (string)($row['type'] ?? ''), 'typeDe' => (string)($row['type_de'] ?? ''), 'iauType' => (string)($row['iau_type'] ?? ''), 'iauTypeDe' => (string)($row['iau_type_de'] ?? ''), 'lat' => isset($row['lati_n']) ? (float)$row['lati_n'] : null, 'latLabel' => (string)($row['lati_c'] ?? ''), 'lon' => isset($row['longi_n']) ? (float)$row['longi_n'] : null, 'lon360' => isset($row['longi_n_360']) ? (float)$row['longi_n_360'] : null, 'lonLabel' => (string)($row['longi_c'] ?? ''), 'diameterKm' => isset($row['diameter_km']) && $row['diameter_km'] !== null ? (float)$row['diameter_km'] : null, ]; } } catch (Throwable $exception) { $moonCraterRows = []; } ?>