PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $userId = (int) $_SESSION['user_id']; $errors = []; $successMessage = ''; $satelliteSearchResults = []; $minorplanetSearchResults = []; $satelliteSearchQuery = trim($_GET['sat_q'] ?? ''); $minorplanetSearchQuery = trim($_GET['mp_q'] ?? ''); $pageTitle = 'Favoriten - AstroTools'; $headerIntroPre = 'Merkliste'; $headerIntroTitle = 'Favoriten'; $headerIntroSub = 'Satelliten und Kleinplaneten zentral verwalten.'; function h(?string $value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); } function setExclusiveFavorite(PDO $pdo, string $tableName, string $idColumn, int $userId, int $entityId): bool { $pdo->beginTransaction(); try { $stmtCurrent = $pdo->prepare(" SELECT `is_favorite` FROM `{$tableName}` WHERE `user_id` = :user_id AND `{$idColumn}` = :entity_id LIMIT 1 "); $stmtCurrent->execute([ ':user_id' => $userId, ':entity_id' => $entityId, ]); $current = $stmtCurrent->fetchColumn(); if ($current === false) { $pdo->rollBack(); return false; } $newValue = (int) $current === 1 ? 0 : 1; if ($newValue === 1) { $stmtReset = $pdo->prepare(" UPDATE `{$tableName}` SET `is_favorite` = 0 WHERE `user_id` = :user_id "); $stmtReset->execute([ ':user_id' => $userId, ]); } $stmtSet = $pdo->prepare(" UPDATE `{$tableName}` SET `is_favorite` = :is_favorite WHERE `user_id` = :user_id AND `{$idColumn}` = :entity_id "); $stmtSet->execute([ ':is_favorite' => $newValue, ':user_id' => $userId, ':entity_id' => $entityId, ]); $pdo->commit(); return true; } catch (Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } throw $e; } } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; if ($action === 'add_satellite') { $satelliteId = (int) ($_POST['satellite_id'] ?? 0); if ($satelliteId <= 0) { $errors[] = 'Ungueltiger Satellit.'; } if (empty($errors)) { $stmtCheck = $pdo->prepare(" SELECT `id` FROM `sat_satellites` WHERE `id` = :id LIMIT 1 "); $stmtCheck->execute([ ':id' => $satelliteId, ]); if (!$stmtCheck->fetch()) { $errors[] = 'Der Satellit wurde nicht gefunden.'; } } if (empty($errors)) { $stmtInsert = $pdo->prepare(" INSERT INTO `app_user_satellites` ( `user_id`, `satellite_id`, `is_favorite`, `created_at` ) VALUES ( :user_id, :satellite_id, 0, NOW() ) ON DUPLICATE KEY UPDATE `satellite_id` = VALUES(`satellite_id`) "); $stmtInsert->execute([ ':user_id' => $userId, ':satellite_id' => $satelliteId, ]); $successMessage = 'Der Satellit wurde hinzugefuegt.'; } } if ($action === 'remove_satellite') { $satelliteId = (int) ($_POST['satellite_id'] ?? 0); if ($satelliteId <= 0) { $errors[] = 'Ungueltiger Satellit.'; } if (empty($errors)) { $stmtDelete = $pdo->prepare(" DELETE FROM `app_user_satellites` WHERE `user_id` = :user_id AND `satellite_id` = :satellite_id "); $stmtDelete->execute([ ':user_id' => $userId, ':satellite_id' => $satelliteId, ]); $successMessage = 'Der Satellit wurde entfernt.'; } } if ($action === 'toggle_satellite_favorite') { $satelliteId = (int) ($_POST['satellite_id'] ?? 0); if ($satelliteId <= 0) { $errors[] = 'Ungueltiger Satellit.'; } if (empty($errors)) { if (!setExclusiveFavorite($pdo, 'app_user_satellites', 'satellite_id', $userId, $satelliteId)) { $errors[] = 'Der Satellit ist nicht in deiner Liste vorhanden.'; } else { $successMessage = 'Der Satelliten-Favorit wurde aktualisiert.'; } } } if ($action === 'add_minorplanet') { $minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0); if ($minorplanetId <= 0) { $errors[] = 'Ungueltiger Kleinplanet.'; } if (empty($errors)) { $stmtCheck = $pdo->prepare(" SELECT `id` FROM `minorplanets_mpc` WHERE `id` = :id LIMIT 1 "); $stmtCheck->execute([ ':id' => $minorplanetId, ]); if (!$stmtCheck->fetch()) { $errors[] = 'Der Kleinplanet wurde nicht gefunden.'; } } if (empty($errors)) { $stmtInsert = $pdo->prepare(" INSERT INTO `app_user_minorplanets` ( `user_id`, `minorplanet_id`, `is_favorite`, `created_at` ) VALUES ( :user_id, :minorplanet_id, 0, NOW() ) ON DUPLICATE KEY UPDATE `minorplanet_id` = VALUES(`minorplanet_id`) "); $stmtInsert->execute([ ':user_id' => $userId, ':minorplanet_id' => $minorplanetId, ]); $successMessage = 'Der Kleinplanet wurde hinzugefuegt.'; } } if ($action === 'remove_minorplanet') { $minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0); if ($minorplanetId <= 0) { $errors[] = 'Ungueltiger Kleinplanet.'; } if (empty($errors)) { $stmtDelete = $pdo->prepare(" DELETE FROM `app_user_minorplanets` WHERE `user_id` = :user_id AND `minorplanet_id` = :minorplanet_id "); $stmtDelete->execute([ ':user_id' => $userId, ':minorplanet_id' => $minorplanetId, ]); $successMessage = 'Der Kleinplanet wurde entfernt.'; } } if ($action === 'toggle_minorplanet_favorite') { $minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0); if ($minorplanetId <= 0) { $errors[] = 'Ungueltiger Kleinplanet.'; } if (empty($errors)) { if (!setExclusiveFavorite($pdo, 'app_user_minorplanets', 'minorplanet_id', $userId, $minorplanetId)) { $errors[] = 'Der Kleinplanet ist nicht in deiner Liste vorhanden.'; } else { $successMessage = 'Der Kleinplaneten-Favorit wurde aktualisiert.'; } } } } if ($satelliteSearchQuery !== '') { if (ctype_digit($satelliteSearchQuery)) { $stmtSatelliteSearch = $pdo->prepare(" SELECT s.`id`, s.`norad_cat_id`, s.`object_name`, CASE WHEN aus.`satellite_id` IS NULL THEN 0 ELSE 1 END AS `already_added` FROM `sat_satellites` s LEFT JOIN `app_user_satellites` aus ON aus.`satellite_id` = s.`id` AND aus.`user_id` = :user_id WHERE s.`norad_cat_id` = :norad_cat_id ORDER BY s.`object_name` ASC LIMIT 50 "); $stmtSatelliteSearch->execute([ ':user_id' => $userId, ':norad_cat_id' => (int) $satelliteSearchQuery, ]); } else { $stmtSatelliteSearch = $pdo->prepare(" SELECT s.`id`, s.`norad_cat_id`, s.`object_name`, CASE WHEN aus.`satellite_id` IS NULL THEN 0 ELSE 1 END AS `already_added` FROM `sat_satellites` s LEFT JOIN `app_user_satellites` aus ON aus.`satellite_id` = s.`id` AND aus.`user_id` = :user_id WHERE s.`object_name` LIKE :query ORDER BY s.`object_name` ASC LIMIT 50 "); $stmtSatelliteSearch->execute([ ':user_id' => $userId, ':query' => '%' . $satelliteSearchQuery . '%', ]); } $satelliteSearchResults = $stmtSatelliteSearch->fetchAll(); } if ($minorplanetSearchQuery !== '') { if (ctype_digit($minorplanetSearchQuery)) { $stmtMinorplanetSearch = $pdo->prepare(" SELECT mp.`id`, mp.`mp_number`, mp.`designation_text`, mp.`desig_packed`, CASE WHEN aum.`minorplanet_id` IS NULL THEN 0 ELSE 1 END AS `already_added` FROM `minorplanets_mpc` mp LEFT JOIN `app_user_minorplanets` aum ON aum.`minorplanet_id` = mp.`id` AND aum.`user_id` = :user_id WHERE mp.`mp_number` = :mp_number ORDER BY mp.`mp_number` ASC, mp.`designation_text` ASC LIMIT 50 "); $stmtMinorplanetSearch->execute([ ':user_id' => $userId, ':mp_number' => (int) $minorplanetSearchQuery, ]); } else { $stmtMinorplanetSearch = $pdo->prepare(" SELECT mp.`id`, mp.`mp_number`, mp.`designation_text`, mp.`desig_packed`, CASE WHEN aum.`minorplanet_id` IS NULL THEN 0 ELSE 1 END AS `already_added` FROM `minorplanets_mpc` mp LEFT JOIN `app_user_minorplanets` aum ON aum.`minorplanet_id` = mp.`id` AND aum.`user_id` = :user_id WHERE mp.`designation_text` LIKE :query OR mp.`desig_packed` LIKE :query ORDER BY mp.`mp_number` IS NULL ASC, mp.`mp_number` ASC, mp.`designation_text` ASC LIMIT 50 "); $stmtMinorplanetSearch->execute([ ':user_id' => $userId, ':query' => '%' . $minorplanetSearchQuery . '%', ]); } $minorplanetSearchResults = $stmtMinorplanetSearch->fetchAll(); } $stmtTrackedSatellites = $pdo->prepare(" SELECT s.`id`, s.`norad_cat_id`, s.`object_name`, aus.`is_favorite`, aus.`created_at` FROM `app_user_satellites` aus INNER JOIN `sat_satellites` s ON s.`id` = aus.`satellite_id` WHERE aus.`user_id` = :user_id ORDER BY aus.`is_favorite` DESC, s.`object_name` ASC "); $stmtTrackedSatellites->execute([ ':user_id' => $userId, ]); $trackedSatellites = $stmtTrackedSatellites->fetchAll(); $stmtTrackedMinorplanets = $pdo->prepare(" SELECT mp.`id`, mp.`mp_number`, mp.`designation_text`, mp.`desig_packed`, aum.`is_favorite`, aum.`created_at` FROM `app_user_minorplanets` aum INNER JOIN `minorplanets_mpc` mp ON mp.`id` = aum.`minorplanet_id` WHERE aum.`user_id` = :user_id ORDER BY aum.`is_favorite` DESC, mp.`mp_number` IS NULL ASC, mp.`mp_number` ASC, mp.`designation_text` ASC "); $stmtTrackedMinorplanets->execute([ ':user_id' => $userId, ]); $trackedMinorplanets = $stmtTrackedMinorplanets->fetchAll(); $loggedIn = true; ?>

Satelliten suchen

Suchergebnisse

Keine passenden Satelliten gefunden.

Name NORAD
Bereits hinzugefuegt

Kleinplaneten suchen

Suchergebnisse

Keine passenden Kleinplaneten gefunden.

Bezeichnung Nummer
Bereits hinzugefuegt

Meine Satelliten

Du hast noch keine Satelliten ausgewaehlt.

Name NORAD Favorit Hinzugefuegt

Meine Kleinplaneten

Du hast noch keine Kleinplaneten ausgewaehlt.

Bezeichnung Nummer Favorit Hinzugefuegt