import Meteorschauers fertig

This commit is contained in:
2026-04-03 18:40:59 +02:00
parent b2462f6512
commit 5d5901c623
7 changed files with 425 additions and 1130 deletions
+11
View File
@@ -0,0 +1,11 @@
<?php
$config = require getcwd() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'database.php';
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', $config['host'], $config['dbname'], $config['charset'] ?? 'utf8mb4');
try {
$pdo = new PDO($dsn, $config['user'], $config['pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
echo "CONNECTED\n";
$stmt = $pdo->query('SHOW TABLES LIKE "meteorshowers"');
var_export($stmt->fetchColumn()); echo "\n";
} catch (Throwable $e) {
echo get_class($e) . ': ' . $e->getMessage() . "\n";
}
+20
View File
@@ -0,0 +1,20 @@
<?php
$config = require getcwd() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'database.php';
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', $config['host'], $config['dbname'], $config['charset'] ?? 'utf8mb4');
$sql = <<<'SQL'
CREATE TABLE IF NOT EXISTS `meteorshowers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`shower_code` varchar(16) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_meteorshowers_code` (`shower_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
SQL;
try {
$pdo = new PDO($dsn, $config['user'], $config['pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec($sql);
echo "CREATE_OK\n";
$stmt = $pdo->query('SHOW TABLES LIKE "meteorshowers"');
var_export($stmt->fetchColumn()); echo "\n";
} catch (Throwable $e) {
echo get_class($e) . ': ' . $e->getMessage() . "\n";
}
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
<?php
$_SERVER['REQUEST_METHOD'] = 'POST';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['SERVER_NAME'] = 'localhost';
$_POST['json_path'] = getcwd() . DIRECTORY_SEPARATOR . 'scripts' . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'MeteorShowers.json';
ob_start();
require getcwd() . DIRECTORY_SEPARATOR . 'scripts' . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'import_meteorshowers.php';
$output = ob_get_clean();
echo $output;
+6
View File
@@ -0,0 +1,6 @@
<?php
$config = require getcwd() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . '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]);
$cols = $pdo->query('SHOW COLUMNS FROM `meteorshowers`')->fetchAll(PDO::FETCH_COLUMN);
echo implode(",", $cols), "\n";
+45 -35
View File
@@ -56,7 +56,7 @@ CREATE TABLE IF NOT EXISTS `app_user_locations` (
KEY `idx_app_user_locations_user_id` (`user_id`),
KEY `idx_app_user_locations_is_default` (`is_default`),
CONSTRAINT `fk_app_user_locations_user_id` FOREIGN KEY (`user_id`) REFERENCES `app_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
@@ -90,7 +90,7 @@ CREATE TABLE IF NOT EXISTS `app_user_satellites` (
KEY `idx_app_user_satellites_satellite_id` (`satellite_id`),
CONSTRAINT `fk_app_user_satellites_satellite_id` FOREIGN KEY (`satellite_id`) REFERENCES `sat_satellites` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_app_user_satellites_user_id` FOREIGN KEY (`user_id`) REFERENCES `app_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
@@ -244,36 +244,6 @@ CREATE TABLE IF NOT EXISTS `dso_objects` (
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.meteoshowers
CREATE TABLE IF NOT EXISTS `meteoshowers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`shower_code` varchar(16) NOT NULL,
`designation` varchar(255) NOT NULL,
`iau_no` int(10) unsigned DEFAULT NULL,
`speed` double DEFAULT NULL,
`radiant_alpha` double DEFAULT NULL,
`radiant_delta` double DEFAULT NULL,
`drift_alpha` double DEFAULT NULL,
`drift_delta` double DEFAULT NULL,
`parent_obj` varchar(255) DEFAULT NULL,
`pidx` double DEFAULT NULL,
`activity_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`activity_json`)),
`source_entry_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`source_entry_json`)),
`source_dataset_name` varchar(128) DEFAULT NULL,
`source_dataset_version` int(10) unsigned DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uq_meteoshowers_shower_code` (`shower_code`),
UNIQUE KEY `uq_meteoshowers_iau_no` (`iau_no`),
KEY `idx_meteoshowers_designation` (`designation`),
KEY `idx_meteoshowers_parent_obj` (`parent_obj`),
KEY `idx_meteoshowers_speed` (`speed`),
KEY `idx_meteoshowers_pidx` (`pidx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.geo_places
CREATE TABLE IF NOT EXISTS `geo_places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
@@ -339,6 +309,46 @@ CREATE TABLE IF NOT EXISTS `geo_places_special` (
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.meteorshowers
CREATE TABLE IF NOT EXISTS `meteorshowers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Eindeutige interne ID des Meteorstroms',
`shower_code` varchar(16) NOT NULL COMMENT 'Kurzer IAU- oder Projektcode des Meteorstroms, z. B. PER oder GEM',
`iau_no` smallint(5) unsigned DEFAULT NULL COMMENT 'Offizielle IAU-Nummer des Meteorstroms, falls vorhanden',
`designation` varchar(255) NOT NULL COMMENT 'Vollstaendige Bezeichnung des Meteorstroms',
`speed_kms` decimal(6,2) DEFAULT NULL COMMENT 'Geozentrische Eintrittsgeschwindigkeit der Meteore in km/s',
`radiant_alpha_deg` decimal(7,3) DEFAULT NULL COMMENT 'Rektaszension des Radianten in Grad',
`radiant_delta_deg` decimal(7,3) DEFAULT NULL COMMENT 'Deklination des Radianten in Grad',
`drift_alpha_deg` decimal(7,3) DEFAULT NULL COMMENT 'Taegliche Aenderung der Radianten-Rektaszension in Grad',
`drift_delta_deg` decimal(7,3) DEFAULT NULL COMMENT 'Taegliche Aenderung der Radianten-Deklination in Grad',
`parent_object` varchar(255) DEFAULT NULL COMMENT 'Vermuteter oder bekannter Mutterkoerper, z. B. ein Komet oder Asteroid',
`population_index` decimal(4,2) DEFAULT NULL COMMENT 'Populationsindex r als Mass fuer die Helligkeitsverteilung der Meteore',
`active_start_sol` decimal(6,2) DEFAULT NULL COMMENT 'Beginn der Aktivitaet in Sonnenlaenge (Grad, 0-360)',
`active_finish_sol` decimal(6,2) DEFAULT NULL COMMENT 'Ende der Aktivitaet in Sonnenlaenge (Grad, 0-360)',
`peak_sol` decimal(6,2) DEFAULT NULL COMMENT 'Maximum des Meteorstroms in Sonnenlaenge (Grad, 0-360)',
`zhr` int(11) DEFAULT NULL COMMENT 'Zenithal Hourly Rate des generischen Aktivitaetseintrags',
`zhr_variable` varchar(32) DEFAULT NULL COMMENT 'Textuelle variable ZHR-Angabe, z. B. 5-20 oder 20-700',
`disttype` tinyint(3) unsigned DEFAULT NULL COMMENT 'Typ der Aktivitaetsverteilung aus der Quelldatei',
`b1` decimal(8,4) DEFAULT NULL COMMENT 'Parameter b1 fuer das Aktivitaetsprofil aus der Quelldatei',
`b2` decimal(8,4) DEFAULT NULL COMMENT 'Parameter b2 fuer das Aktivitaetsprofil aus der Quelldatei',
`activity_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Komplettes activity-Array aus der JSON-Datei mit generischen und jahresspezifischen Aktivitaetsdaten' CHECK (json_valid(`activity_json`)),
`colors_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Optionale Farbverteilung der Meteore aus der JSON-Datei' CHECK (json_valid(`colors_json`)),
`source_entry_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Originaler kompletter JSON-Eintrag des Meteorstroms zur Nachvollziehbarkeit' CHECK (json_valid(`source_entry_json`)),
`has_yearly_variants` tinyint(1) NOT NULL DEFAULT 0 COMMENT '1, wenn neben generic auch jahresspezifische Aktivitaetseintraege vorhanden sind',
`dataset_version` int(10) unsigned DEFAULT NULL COMMENT 'Versionsnummer des importierten Quelldatensatzes',
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT 'Zeitpunkt der letzten Aktualisierung des Datensatzes',
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Zeitpunkt der Erstellung des Datensatzes',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_meteorshowers_code` (`shower_code`),
UNIQUE KEY `uq_meteorshowers_iau_no` (`iau_no`),
KEY `idx_meteorshowers_designation` (`designation`),
KEY `idx_meteorshowers_active_start` (`active_start_sol`),
KEY `idx_meteorshowers_active_finish` (`active_finish_sol`),
KEY `idx_meteorshowers_peak` (`peak_sol`),
KEY `idx_meteorshowers_zhr` (`zhr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Meteorstroeme mit Stammdaten sowie generischen und historischen Aktivitaetsinformationen';
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.minorplanets_mpc
CREATE TABLE IF NOT EXISTS `minorplanets_mpc` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
@@ -480,7 +490,7 @@ CREATE TABLE IF NOT EXISTS `sat_import_runs` (
PRIMARY KEY (`id`),
KEY `idx_sat_import_runs_source` (`source`),
KEY `idx_sat_import_runs_started_at` (`started_at`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
@@ -530,7 +540,7 @@ CREATE TABLE IF NOT EXISTS `sat_satellites` (
KEY `idx_sat_satellites_object_name` (`object_name`),
KEY `idx_sat_satellites_object_type` (`object_type`),
KEY `idx_sat_satellites_object_id` (`object_id`)
) ENGINE=InnoDB AUTO_INCREMENT=236690 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=296305 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
@@ -567,7 +577,7 @@ CREATE TABLE IF NOT EXISTS `sat_tle_current` (
KEY `idx_sat_tle_current_epoch` (`epoch`),
KEY `idx_sat_tle_current_source` (`source`),
CONSTRAINT `fk_sat_tle_current_satellite_id` FOREIGN KEY (`satellite_id`) REFERENCES `sat_satellites` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=236690 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=296305 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
+198 -68
View File
@@ -1,6 +1,8 @@
<php
<?php
declare(strict_types=1);
// Die Datei MeteorShowers.json stammt aus Stellarium und dient hier als Importquelle.
session_start();
$loggedIn = isset($_SESSION['user_id']);
@@ -46,33 +48,123 @@ function toNullableInt(mixed $value): ?int
function ensureMeteorShowersTable(PDO $pdo): void
{
$pdo->exec(
"CREATE TABLE IF NOT EXISTS `meteoshowers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`shower_code` varchar(16) NOT NULL,
`designation` varchar(255) NOT NULL,
`iau_no` int(10) unsigned DEFAULT NULL,
`speed` double DEFAULT NULL,
`radiant_alpha` double DEFAULT NULL,
`radiant_delta` double DEFAULT NULL,
`drift_alpha` double DEFAULT NULL,
`drift_delta` double DEFAULT NULL,
`parent_obj` varchar(255) DEFAULT NULL,
`pidx` double DEFAULT NULL,
`activity_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`activity_json`)),
`source_entry_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`source_entry_json`)),
`source_dataset_name` varchar(128) DEFAULT NULL,
`source_dataset_version` int(10) unsigned DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
"CREATE TABLE IF NOT EXISTS `meteorshowers` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Eindeutige interne ID des Meteorstroms',
`shower_code` varchar(16) NOT NULL COMMENT 'Kurzer IAU- oder Projektcode des Meteorstroms, z. B. PER oder GEM',
`iau_no` smallint(5) unsigned DEFAULT NULL COMMENT 'Offizielle IAU-Nummer des Meteorstroms, falls vorhanden',
`designation` varchar(255) NOT NULL COMMENT 'Vollstaendige Bezeichnung des Meteorstroms',
`speed_kms` decimal(6,2) DEFAULT NULL COMMENT 'Geozentrische Eintrittsgeschwindigkeit der Meteore in km/s',
`radiant_alpha_deg` decimal(7,3) DEFAULT NULL COMMENT 'Rektaszension des Radianten in Grad',
`radiant_delta_deg` decimal(7,3) DEFAULT NULL COMMENT 'Deklination des Radianten in Grad',
`drift_alpha_deg` decimal(7,3) DEFAULT NULL COMMENT 'Taegliche Aenderung der Radianten-Rektaszension in Grad',
`drift_delta_deg` decimal(7,3) DEFAULT NULL COMMENT 'Taegliche Aenderung der Radianten-Deklination in Grad',
`parent_object` varchar(255) DEFAULT NULL COMMENT 'Vermuteter oder bekannter Mutterkoerper, z. B. ein Komet oder Asteroid',
`population_index` decimal(4,2) DEFAULT NULL COMMENT 'Populationsindex r als Mass fuer die Helligkeitsverteilung der Meteore',
`active_start_sol` decimal(6,2) DEFAULT NULL COMMENT 'Beginn der Aktivitaet in Sonnenlaenge (Grad, 0-360)',
`active_finish_sol` decimal(6,2) DEFAULT NULL COMMENT 'Ende der Aktivitaet in Sonnenlaenge (Grad, 0-360)',
`peak_sol` decimal(6,2) DEFAULT NULL COMMENT 'Maximum des Meteorstroms in Sonnenlaenge (Grad, 0-360)',
`zhr` int(11) DEFAULT NULL COMMENT 'Zenithal Hourly Rate des generischen Aktivitaetseintrags',
`zhr_variable` varchar(32) DEFAULT NULL COMMENT 'Textuelle variable ZHR-Angabe, z. B. 5-20 oder 20-700',
`disttype` tinyint(3) unsigned DEFAULT NULL COMMENT 'Typ der Aktivitaetsverteilung aus der Quelldatei',
`b1` decimal(8,4) DEFAULT NULL COMMENT 'Parameter b1 fuer das Aktivitaetsprofil aus der Quelldatei',
`b2` decimal(8,4) DEFAULT NULL COMMENT 'Parameter b2 fuer das Aktivitaetsprofil aus der Quelldatei',
`activity_json` json DEFAULT NULL COMMENT 'Komplettes activity-Array aus der JSON-Datei mit generischen und jahresspezifischen Aktivitaetsdaten',
`colors_json` json DEFAULT NULL COMMENT 'Optionale Farbverteilung der Meteore aus der JSON-Datei',
`source_entry_json` json DEFAULT NULL COMMENT 'Originaler kompletter JSON-Eintrag des Meteorstroms zur Nachvollziehbarkeit',
`has_yearly_variants` tinyint(1) NOT NULL DEFAULT 0 COMMENT '1, wenn neben generic auch jahresspezifische Aktivitaetseintraege vorhanden sind',
`dataset_version` int(10) unsigned DEFAULT NULL COMMENT 'Versionsnummer des importierten Quelldatensatzes',
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT 'Zeitpunkt der letzten Aktualisierung des Datensatzes',
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Zeitpunkt der Erstellung des Datensatzes',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_meteoshowers_shower_code` (`shower_code`),
UNIQUE KEY `uq_meteoshowers_iau_no` (`iau_no`),
KEY `idx_meteoshowers_designation` (`designation`),
KEY `idx_meteoshowers_parent_obj` (`parent_obj`),
KEY `idx_meteoshowers_speed` (`speed`),
KEY `idx_meteoshowers_pidx` (`pidx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
UNIQUE KEY `uq_meteorshowers_code` (`shower_code`),
UNIQUE KEY `uq_meteorshowers_iau_no` (`iau_no`),
KEY `idx_meteorshowers_designation` (`designation`),
KEY `idx_meteorshowers_active_start` (`active_start_sol`),
KEY `idx_meteorshowers_active_finish` (`active_finish_sol`),
KEY `idx_meteorshowers_peak` (`peak_sol`),
KEY `idx_meteorshowers_zhr` (`zhr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Meteorstroeme mit Stammdaten sowie generischen und historischen Aktivitaetsinformationen'"
);
$requiredColumns = [
'shower_code',
'iau_no',
'designation',
'speed_kms',
'radiant_alpha_deg',
'radiant_delta_deg',
'drift_alpha_deg',
'drift_delta_deg',
'parent_object',
'population_index',
'active_start_sol',
'active_finish_sol',
'peak_sol',
'zhr',
'zhr_variable',
'disttype',
'b1',
'b2',
'activity_json',
'colors_json',
'source_entry_json',
'has_yearly_variants',
'dataset_version',
];
$stmt = $pdo->query('SHOW COLUMNS FROM `meteorshowers`');
$existingColumns = $stmt->fetchAll(PDO::FETCH_COLUMN);
$missingColumns = array_values(array_diff($requiredColumns, $existingColumns));
if ($missingColumns !== []) {
throw new RuntimeException(
'Tabelle `meteorshowers` hat nicht das erwartete Schema. Fehlende Spalten: '
. implode(', ', $missingColumns)
);
}
}
function findGenericActivity(array $activity): ?array
{
foreach ($activity as $entry) {
if (!is_array($entry)) {
continue;
}
if (strtolower(trim((string)($entry['year'] ?? ''))) === 'generic') {
return $entry;
}
}
return null;
}
function hasYearlyVariants(array $activity): bool
{
foreach ($activity as $entry) {
if (!is_array($entry)) {
continue;
}
$year = strtolower(trim((string)($entry['year'] ?? '')));
if ($year !== '' && $year !== 'generic') {
return true;
}
}
return false;
}
function toNullableString(mixed $value): ?string
{
if ($value === null) {
return null;
}
$value = trim((string)$value);
return $value === '' ? null : $value;
}
$defaultJsonPath = realpath(__DIR__ . '/MeteorShowers.json') ?: (__DIR__ . '/MeteorShowers.json');
@@ -123,56 +215,83 @@ if ($canUseImportPage && $_SERVER['REQUEST_METHOD'] === 'POST') {
throw new RuntimeException('Ungueltige JSON-Struktur: "showers" fehlt oder ist kein Objekt.');
}
$datasetName = isset($data['shortName']) ? trim((string)$data['shortName']) : null;
$datasetName = toNullableString($data['shortName'] ?? null);
$datasetVersion = toNullableInt($data['version'] ?? null);
$selectStmt = $pdo->prepare('SELECT `id` FROM `meteoshowers` WHERE `shower_code` = :shower_code LIMIT 1');
$selectStmt = $pdo->prepare('SELECT `id` FROM `meteorshowers` WHERE `shower_code` = :shower_code LIMIT 1');
$upsertStmt = $pdo->prepare(
"INSERT INTO `meteoshowers` (
"INSERT INTO `meteorshowers` (
`shower_code`,
`designation`,
`iau_no`,
`speed`,
`radiant_alpha`,
`radiant_delta`,
`drift_alpha`,
`drift_delta`,
`parent_obj`,
`pidx`,
`speed_kms`,
`radiant_alpha_deg`,
`radiant_delta_deg`,
`drift_alpha_deg`,
`drift_delta_deg`,
`parent_object`,
`population_index`,
`active_start_sol`,
`active_finish_sol`,
`peak_sol`,
`zhr`,
`zhr_variable`,
`disttype`,
`b1`,
`b2`,
`activity_json`,
`colors_json`,
`source_entry_json`,
`source_dataset_name`,
`source_dataset_version`
`has_yearly_variants`,
`dataset_version`
) VALUES (
:shower_code,
:designation,
:iau_no,
:speed,
:radiant_alpha,
:radiant_delta,
:drift_alpha,
:drift_delta,
:parent_obj,
:pidx,
:speed_kms,
:radiant_alpha_deg,
:radiant_delta_deg,
:drift_alpha_deg,
:drift_delta_deg,
:parent_object,
:population_index,
:active_start_sol,
:active_finish_sol,
:peak_sol,
:zhr,
:zhr_variable,
:disttype,
:b1,
:b2,
:activity_json,
:colors_json,
:source_entry_json,
:source_dataset_name,
:source_dataset_version
:has_yearly_variants,
:dataset_version
)
ON DUPLICATE KEY UPDATE
`designation` = VALUES(`designation`),
`iau_no` = VALUES(`iau_no`),
`speed` = VALUES(`speed`),
`radiant_alpha` = VALUES(`radiant_alpha`),
`radiant_delta` = VALUES(`radiant_delta`),
`drift_alpha` = VALUES(`drift_alpha`),
`drift_delta` = VALUES(`drift_delta`),
`parent_obj` = VALUES(`parent_obj`),
`pidx` = VALUES(`pidx`),
`speed_kms` = VALUES(`speed_kms`),
`radiant_alpha_deg` = VALUES(`radiant_alpha_deg`),
`radiant_delta_deg` = VALUES(`radiant_delta_deg`),
`drift_alpha_deg` = VALUES(`drift_alpha_deg`),
`drift_delta_deg` = VALUES(`drift_delta_deg`),
`parent_object` = VALUES(`parent_object`),
`population_index` = VALUES(`population_index`),
`active_start_sol` = VALUES(`active_start_sol`),
`active_finish_sol` = VALUES(`active_finish_sol`),
`peak_sol` = VALUES(`peak_sol`),
`zhr` = VALUES(`zhr`),
`zhr_variable` = VALUES(`zhr_variable`),
`disttype` = VALUES(`disttype`),
`b1` = VALUES(`b1`),
`b2` = VALUES(`b2`),
`activity_json` = VALUES(`activity_json`),
`colors_json` = VALUES(`colors_json`),
`source_entry_json` = VALUES(`source_entry_json`),
`source_dataset_name` = VALUES(`source_dataset_name`),
`source_dataset_version` = VALUES(`source_dataset_version`),
`has_yearly_variants` = VALUES(`has_yearly_variants`),
`dataset_version` = VALUES(`dataset_version`),
`updated_at` = CURRENT_TIMESTAMP()"
);
@@ -200,22 +319,33 @@ if ($canUseImportPage && $_SERVER['REQUEST_METHOD'] === 'POST') {
}
$activity = isset($entry['activity']) && is_array($entry['activity']) ? $entry['activity'] : [];
$genericActivity = findGenericActivity($activity);
$colors = isset($entry['colors']) && is_array($entry['colors']) ? $entry['colors'] : [];
$upsertStmt->execute([
':shower_code' => $showerCode,
':designation' => $designation,
':iau_no' => toNullableInt($entry['IAUNo'] ?? null),
':speed' => toNullableFloat($entry['speed'] ?? null),
':radiant_alpha' => toNullableFloat($entry['radiantAlpha'] ?? null),
':radiant_delta' => toNullableFloat($entry['radiantDelta'] ?? null),
':drift_alpha' => toNullableFloat($entry['driftAlpha'] ?? null),
':drift_delta' => toNullableFloat($entry['driftDelta'] ?? null),
':parent_obj' => isset($entry['parentObj']) && trim((string)$entry['parentObj']) !== '' ? trim((string)$entry['parentObj']) : null,
':pidx' => toNullableFloat($entry['pidx'] ?? null),
':speed_kms' => toNullableFloat($entry['speed'] ?? null),
':radiant_alpha_deg' => toNullableFloat($entry['radiantAlpha'] ?? null),
':radiant_delta_deg' => toNullableFloat($entry['radiantDelta'] ?? null),
':drift_alpha_deg' => toNullableFloat($entry['driftAlpha'] ?? null),
':drift_delta_deg' => toNullableFloat($entry['driftDelta'] ?? null),
':parent_object' => toNullableString($entry['parentObj'] ?? null),
':population_index' => toNullableFloat($entry['pidx'] ?? null),
':active_start_sol' => toNullableFloat($genericActivity['start'] ?? null),
':active_finish_sol' => toNullableFloat($genericActivity['finish'] ?? null),
':peak_sol' => toNullableFloat($genericActivity['peak'] ?? null),
':zhr' => toNullableInt($genericActivity['zhr'] ?? null),
':zhr_variable' => toNullableString($genericActivity['variable'] ?? null),
':disttype' => toNullableInt($genericActivity['disttype'] ?? null),
':b1' => toNullableFloat($genericActivity['b1'] ?? null),
':b2' => toNullableFloat($genericActivity['b2'] ?? null),
':activity_json' => json_encode($activity, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
':colors_json' => $colors !== [] ? json_encode($colors, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : null,
':source_entry_json' => json_encode($entry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
':source_dataset_name' => $datasetName !== null && $datasetName !== '' ? $datasetName : null,
':source_dataset_version' => $datasetVersion,
':has_yearly_variants' => hasYearlyVariants($activity) ? 1 : 0,
':dataset_version' => $datasetVersion,
]);
$processed++;
@@ -227,7 +357,7 @@ if ($canUseImportPage && $_SERVER['REQUEST_METHOD'] === 'POST') {
}
$pdo->commit();
$tableCount = (int)$pdo->query('SELECT COUNT(*) FROM `meteoshowers`')->fetchColumn();
$tableCount = (int)$pdo->query('SELECT COUNT(*) FROM `meteorshowers`')->fetchColumn();
$report = [
'json_path' => $jsonPath,
'dataset_name' => $datasetName,
@@ -256,7 +386,7 @@ if ($canUseImportPage && $_SERVER['REQUEST_METHOD'] === 'POST') {
<div style="max-width:900px;margin:0 auto;background:#fff;border:1px solid #ccc;padding:24px;">
<h1 style="margin:0 0 12px;">Meteor-Import</h1>
<p style="margin:0 0 18px;">
Importiert <code>MeteorShowers.json</code> in die Tabelle <code>meteoshowers</code>.
Importiert <code>MeteorShowers.json</code> in die Tabelle <code>meteorshowers</code>.
Die Tabelle wird bei Bedarf automatisch angelegt.
</p>
@@ -297,7 +427,7 @@ if ($canUseImportPage && $_SERVER['REQUEST_METHOD'] === 'POST') {
Verarbeitet: <?= h((string)$report['processed']) ?><br>
Neu: <?= h((string)$report['inserted']) ?><br>
Aktualisiert: <?= h((string)$report['updated']) ?><br>
Zeilen in `meteoshowers`: <?= h((string)$report['table_count']) ?>
Zeilen in `meteorshowers`: <?= h((string)$report['table_count']) ?>
</div>
<?php endif; ?>
<?php endif; ?>