Horoskop-App: Geburtsort & Zeitzone erfassen
Astrologie-Berechnungen brauchen den exakten Geburtsort mit Zeitzone — geoAPI liefert beides in einem Schritt. Mit Bonus: Reverse-Geocoding-Fallback, falls der Nutzer nur Lat/Lon kennt.
Die Live-Variante dieses Rezepts findest du unter /horoskop.php.
Frontend: Eingabeformular
<form method="post" action="speichern.php">
<label>Geburtsdatum <input type="date" name="date" required></label>
<label>Geburtszeit <input type="time" name="time" step="60" required></label>
<label>
Geburtsort
<input type="text" name="ort" data-geoapi-place
data-geoapi-lat="ort_lat" data-geoapi-lon="ort_lon"
data-geoapi-country="ort_cc"
required>
</label>
<button type="submit">Speichern</button>
</form>
<script src="https://geoapi.world/dist/geoapi-widget.js"></script>
Das Widget legt nach Auswahl automatisch versteckte Felder an: ort_geonameid, ort_timezone, ort_lat, ort_lon, ort_cc.
Backend: Speichern und Validieren
<?php
declare(strict_types=1);
$date = $_POST['date'] ?? '';
$time = $_POST['time'] ?? '';
$ort = trim($_POST['ort'] ?? '');
$geonameid = (int) ($_POST['ort_geonameid'] ?? 0);
$timezone = trim($_POST['ort_timezone'] ?? '');
$lat = (float)($_POST['ort_lat'] ?? 0);
$lon = (float)($_POST['ort_lon'] ?? 0);
if ($geonameid === 0) {
die("Bitte einen Vorschlag aus der Liste wählen — Freitext genügt nicht.");
}
// Zeitzone für DateTime — kritisch für Astrologie!
$utc = new DateTimeImmutable("$date $time", new DateTimeZone($timezone));
$utc = $utc->setTimezone(new DateTimeZone('UTC'));
$pdo->prepare(
'INSERT INTO geburten (datum_local, datum_utc, ort, geonameid, lat, lon, timezone, country_code)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)'
)->execute([
"$date $time",
$utc->format('Y-m-d H:i:s'),
$ort, $geonameid, $lat, $lon, $timezone, $_POST['ort_cc'] ?? '',
]);
Warum geonameid speichern? Ortsnamen ändern sich (Schreibweise, Umzug, Eingemeindung).
Die
geonameid bleibt stabil — egal wie sich der Ort später verändert, du findest ihn wieder.
Reverse-Geocoding-Fallback (für Power-User)
Manche Astrologen kennen Lat/Lon (aus alten Quellen) und wollen die Stadt dazu finden:
<form id="rg-form">
<input type="number" step="0.000001" name="lat" placeholder="Lat" required>
<input type="number" step="0.000001" name="lon" placeholder="Lon" required>
<button>Ort ermitteln</button>
</form>
<div id="rg-result"></div>
<script>
document.getElementById('rg-form').addEventListener('submit', async (e) => {
e.preventDefault();
const f = new FormData(e.target);
const url = `https://geoapi.world/api/v1/lookup.php?lat=${f.get('lat')}&lon=${f.get('lon')}&mode=city`;
const data = await (await fetch(url)).json();
document.getElementById('rg-result').textContent =
data.hit ? `${data.hit.name}, ${data.hit.country_code} (${data.hit.timezone})` : 'kein Treffer';
});
</script>
Wichtig: mode=city liefert die nächste bewohnte Stadt — wichtig für Astrologie, weil Geburten in Häusern stattfinden, nicht auf leerem Feld.
Erweiterungs-Ideen
- Historische Zeitzonen-Korrektur — Berlin hatte 1945 andere TZ-Regeln. PHP-DateTimeZone berücksichtigt das automatisch.
- Sommerzeit-Erkennung anzeigen, falls der Nutzer unsicher ist (z.B. „11:30 — war damals Sommerzeit aktiv?").
- Wenn Geburtsdatum vor 1900: zusätzliche Hinweise zur Genauigkeit der Standortdaten.