← Alle Rezepte

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