Files
sternwarte/sternwarte/sonnenfuehrung.php
rxf 75a6988248 Führungsdaten bei den Anmeldunge bis 14.11. blockiert
dosendmail mit gmx und logdatei
Sondermeldung in rot
2025-10-22 15:08:49 +02:00

492 lines
23 KiB
PHP

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Sternwarte Welzheim</title>
<!--[if IE 5]>
<link href="css/ie5.css" rel="stylesheet" type="text/css"/>
<![endif]-->
<!--[if IE]>
<style type="text/css">
<link href="css/ie.css" rel="stylesheet" type="text/css"/>
</style>
<![endif]-->
<link href="css/jquery-ui.min.css" rel="stylesheet" type="text/css"/>
<link href="css/sternwarte1.css" rel="stylesheet" type="text/css"/>
<script src="javascript/jquery-1.11.0.min.js"></script>
<script src="javascript/jquery-ui-1.10.0.custom.min.js"></script>
<script src="javascript/sternwarte.js"></script>
</head>
<body class="thrColFixHdr">
<div id="container">
<?php include 'header.php'; ?>
<?php include 'navi.php'; ?>
<div id="sidebar2">
<?php include 'fdatum.php'; ?>
<?php include 'himmelerg.php'; ?>
</div>
<div id="datenschutz"></div>
<?php
include 'phpmailer/dosendmail.php';
// ---------- globale Konstanten
$vorlauf = 24;
$monthstoadd = '+ 12 month';
$weekday = 'Sonntag'; // Tag der Führung
$showTime = '11 Uhr'; // Uhrzeit der Führung
?>
<?php
// Aus den 3 Einträgen aus der 'fdatum' table ein leserliches Datum erzeugen
// Parameter:
// $wt -> Wochentag
// $dat -> Datum
// $ti -> Uhrzeit
// Return: Datuns/Zeit-String
function buildDate($dat) {
global $weekday, $showTime;
$dat = preg_replace('#^(\d{4})(\d{2})(\d{2})$#', '\3.\2.\1', $dat);
$r = substr($weekday,0,2) . ", " . $dat . " " . $showTime;
return $r;
}
function holdasdatum($fid) {
global $db;
$sql_sel = "SELECT datum FROM sonnedatum where id = '$fid'";
$result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
$data = $result->fetch_row()[0];
return intval($data);
}
// Aus der DB aus der Table 'sonnedatum' den Eintrag für $fid holen
// und als Datum/Zeit-String übergeben
// Parameter:
// $fid -> id des Führungsdatums in der Datenbank-Tabelle
// Return: Datum/zeit-String
function holDate($fid) {
global $db;
$sql_sel = "SELECT datum FROM sonnedatum where id = '$fid'";
$result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
$data = mysqli_fetch_assoc($result);
$ret = array();
$ret[] = 'So';
$ret[] = $data['datum'];
$ret[] = '11';
$ret[] = buildDate($data['datum']);
return $ret;
}
// die Daten der nächsten Führungen für $monthstoadd Monate in ein Array holen
// Parameter -
// Retunrn: Array mit allen Werte aus der Table
function getNextFuehrungen() {
global $db, $vorlauf, $monthstoadd;
$erg = array();
$toadd = '+' . $vorlauf . 'hour';
$dt = new DateTime($toadd);
$datum_heute = $dt->format('Ymd');
$enddatum = new DateTime('now');
$enddatum->modify($monthstoadd);
$enddatum = $enddatum->format('Ymd');
$datum_heute = 20251114; //<<<<<<<<<<<<<<<<<<<<<<<<<
$sql_sel = "SELECT * FROM sonnedatum where datum >='$datum_heute' && datum <= '$enddatum' order by datum ASC";
$result = mysqli_query($db, $sql_sel) or die(mysqli_error($db));
while ($row = mysqli_fetch_assoc($result)) {
foreach ($row as $key => $value) {
$entry[$key] = $value;
}
$erg[] = $entry;
}
return $erg;
}
// 'select'-Tag für die Führungen bauen
// Paramter:
// $fuehrungen -> Array mit den kommenden Führungen
// Return: String mit dem HTML-Code
function bauNextFuehrungen($fuehrungen, $maxP, $selected) {
$r = "<label for='ftermin' class='labeltext'>" .
"<strong>Führungsdatum</strong></label>" .
"<select name='ftermin' id='ftermin'>";
foreach ($fuehrungen as $f) {
// $count = $f['count'];
$count = getCountsPerDate($f['datum']);
$r .= "<option value='" . $f['id'] . "'";
if($count >= $maxP) {
$r .= "disabled";
}
if($selected && ($f['id'] == $selected)) {
$r .= ' selected="selected" ';
}
$r .= ">" . buildDate($f['datum']);
$r .= " &nbsp;&nbsp;&nbsp;Frei: ";
$frei = $maxP-$count;
if ($frei < 0) $frei = 0;
$r .= $frei;
$r .= "</option>";
}
$r .= "</select>";
return $r;
}
// Zählen, wieviele Personen zu einem Führungstermin angemeldet sind
// Parameter:
// $fid -> id des Führungsdatum
// Return: Anzahl der Personen
function getCountsPerDate($fdate) {
global $db;
$sql_stmt = "SELECT SUM(anzahl) AS count FROM sonneanmeld WHERE fdatum ='$fdate'";
$result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
$data = mysqli_fetch_assoc($result);
return $data['count'];
}
// prüfen, og der User schon eine Buchung gemacht hat
// Geprüft wird die Email-Adresse. Es werden nur Buchungen in
// Zukunft geprüft.
function isDoppelBuchung($email) {
global $db;
$ret = [];
$ret['doppelt'] = false;
$now = date('Ymd');
$sql_stmt = "SELECT * FROM sonneanmeld WHERE email = '$email' AND fdatum > $now";
$result = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
$data = mysqli_fetch_assoc($result);
return $data;
}
// die kompletten Daten eines Teilnehmers anhand der ID ais der DB holen
?>
<div id="mainContent">
<?
// Hier werden alle notwendigen Variablen eingesammelt ------------------------
if (isset($_POST['submit'])) {
$stern_name = $_REQUEST['name'];
$stern_vorname = $_REQUEST['vorname'];
$stern_strasse = $_REQUEST['strasse'];
$stern_ort = $_REQUEST['ort'];
$stern_plz = $_REQUEST['plz'];
$stern_tel = $_REQUEST['tel'];
$stern_mail = $_REQUEST['mail'];
$stern_teil = $_REQUEST['teil'];
$xxx = array();
$xxx[] = holDate($_REQUEST['ftermin']);
$stern_datum_date = holdasdatum($_REQUEST['ftermin']);
$stern_datum = $xxx[0][3];
$stern_fdlink = $_REQUEST['ftermin'];
$stern_submit = $_REQUEST['submit'];
$stern_actionstern = $_REQUEST['stern_actionstern'];
$stern_remarks = $_REQUEST['remarks'];
} else {
$stern_name = '';
$stern_vorname = '';
$stern_strasse = '';
$stern_ort = '';
$stern_plz = '';
$stern_tel = '';
$stern_mail = '';
$stern_teil = '';
$stern_datum = '';
$stern_datum_date = 19000101;
$stern_submit = '';
$stern_fdlink = '';
$stern_actionstern = '';
$stern_remarks = '';
}
// Hier werden default Werte gesetzt ------------------------
$stern_error_msg = '';
$stern_meldung = '';
$stern_errors = 0;
$andererTermin = "bitte wählen Sie einen anderen Termin";
// ----------------------------------------------------------
switch ($stern_actionstern) {
case 'senden':
// Hier wir geprüft, ob alle Felder ausgefüllt sind ------------------------
if (trim($stern_name) == '') {
$stern_error_msg .= 'Bitte geben Sie Ihren Namen ein.<br />';
$stern_errors++;
}
if (trim($stern_strasse) == '') {
$stern_error_msg .= 'Bitte geben Sie eine Straße ein.<br />';
$stern_errors ++;
}
if (trim($stern_plz) == '') {
$stern_error_msg .= 'Bitte geben Sie eine Postleitzahl ein.<br />';
$stern_errors ++;
}
if (! preg_match("/^[0-9]{5}$/", $stern_plz)) {
$stern_error_msg .= 'Bitte geben Sie bei der Postleitzahl mindestens fünf Ziffern und keine Buchstaben ein.<br />';
$stern_errors ++;
}
if (trim($stern_ort) == '') {
$stern_error_msg .= 'Bitte geben Sie einen Ort ein.<br />';
$stern_errors ++;
}
$stern_mail = trim($stern_mail);
if (!preg_match("/^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}/",
strtolower($stern_mail))) {
$stern_error_msg .= 'Bitte geben Sie eine gültige E-Mail-Adresse ein.<br />';
$stern_errors++;
}
$belegt = getCountsPerDate($stern_datum_date);
$rest = $maxBesucher-$belegt;
if((trim($stern_teil) + $belegt) > $maxBesucher) {
if ($rest <= 0) {
$stern_error_msg .= "Die Führung ist ausgebucht, $andererTermin<br />";
} else {
$stern_error_msg .= "Die Führung ist schon mit $belegt Personen belegt, es ";
if ($rest == 1) {
$stern_error_msg .= "kann nur noch 1 Person ";
} else {
$stern_error_msg .= "können höchstens noch $rest Personen ";
}
$stern_error_msg .= "angemeldet werden.<br />";
}
$stern_errors++;
}
$teilnehmer = isDoppelBuchung($stern_mail);
if($teilnehmer != null) {
$stern_error_msg = "Dies ist eine Doppelbuchung. Sie wird <strong>nicht</strong> gespeichert.<br /><br />
<p><a class='button' href='/index.php'>Abbruch</a></p>";
$stern_errors++;
}
$nun = strtotime("now");
list($w,$d,$t,$s) = holDate($stern_fdlink);
$fz = strtotime("$d" . "t" . substr($t,0,2) . "00");
$dauer = ($fz - $nun) / 3600;
if ($dauer <= $vorlauf) {
$stern_error_msg .= "Die Anmeldung muss <strong>spätestens</strong> $vorlauf Stunden vor Beginn der Führung erfolgen - $andererTermin.<br />";
$stern_errors++;
}
if ($stern_errors == 0) {
$sql_stmt = "INSERT INTO sonneanmeld (name, vorname, strasse, plz, stadt, telefon, email, anzahl, fid, remarks, angemeldet, fdatum)" .
" values('$stern_name', '$stern_vorname', '$stern_strasse', '$stern_plz', '$stern_ort', '$stern_tel'," .
"'$stern_mail', '$stern_teil', '$stern_fdlink', '$stern_remarks', CURDATE(), '$stern_datum_date')";
$ins = mysqli_query($db, $sql_stmt) or die(mysqli_error($db));
$person = $stern_teil == 1 ? "Person" : "Personen";
$body = "\r\nName, Vorname: $stern_name, $stern_vorname \r\n" .
"Strasse: $stern_strasse \r\n" .
"Ort: $stern_plz $stern_ort \r\n" .
"Telefon: $stern_tel \r\n" .
"E-mail: $stern_mail \r\n" .
"Gewünschter Termin: $stern_datum \r\n" .
"Personen: $stern_teil \r\n" .
"Bemerkungen: $stern_remarks \r\n";
$bodya = "Sehr geehrte Dame, sehr geehrter Herr, \r\n\r\n" .
"hiermit bestätigen wir Ihre Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim für\r\n\r\n" .
"$stern_vorname $stern_name am " . preg_replace("/(\d+) Uhr/","um $0",$stern_datum) . " für $stern_teil $person " .
// $stern_teil == 1 ? "Person" : "Personen" .
".\r\n\r\n" .
"Die Führung findet NUR bei klarem Himmel statt. Falls der Himmel bedeckt ist \r\n" .
"und die Führung ausfällt, erhalten Sie bis spätestens eine Stunde vor Führungsbeginn \r\n" .
"eine Email. Sie können sich dann gerne zu einem neuen Termin anmelden.\r\n\r\n" .
"Bei Problemen oder Fragen wenden Sie sich bitte per E-Mail an anmeldung@sternwarte-welzheim.de \r\n\r\n" .
"Mit freundlichen Grüßen\r\n\r\n" .
"Beobachterteam der Sternwarte Welzheim\r\n\r\n" .
"www.sternwarte-welzheim.de";
$betreff = "Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim";
$betreffBeo = "Anmeldung zur Sonnen-Führung in Welzheim am $stern_datum";
mb_internal_encoding('UTF-8');
$betreff = mb_encode_mimeheader($betreff, 'UTF-8', 'Q');
// Mail an den Anfragenden
sendmail($betreff, $defaultabsender, $bodya, [], ['anmeldungen@sternwarte.rexfue.de'], [$stern_mail]);
// Mail an einige BEOs und an die Liste
$beoliste = array(
//"andrea.ess@t-online.de",
//"sonderfuehrung@sternwarte-welzheim.de",
"martin.gertz@gmx.de",
// "planetarium@stuttgart.de",
//"info@planetarium-stuttgart.de",
//"HUK@observatory-stuttgart.de",
"hansdschida1@gmail.com",
"anmeldung@sternwarte-welzheim.de",
);
sendmail($betreffBeo, $defaultabsender, $body, $beoliste, [], ["rexfue@gmail.com"] );
$stern_meldung = "<p>Vielen Dank für Ihre Anmeldung. <br /><br />
Wir freuen uns über Ihren Besuch auf der Sternwarte Welzheim am<br />
<div style='text-align:center;'>" .
preg_replace('/(\d+) Uhr/','um $0',$stern_datum) .
" mit $stern_teil $person.
</div> <br />
Wir haben Ihnen die Anmelde-Bestätigung per Email zugesandt (bitte sehen Sie ggf. auch in Ihrem Spam-Ordner nach).</p>
<p><a class='button' href='/index.php'>Zurück</a></p>";
// Antwortseite
?>
<?PHP echo $stern_meldung;
?>
<?PHP
// Ende Antwortseite
break;
} // Ende if ($errors == 0)
else {
// Layout der Fehlermeldung
$stern_error_msg = '<div id="fehler">' . $stern_error_msg . '</div>';
}
// Wenn ein Fehler aufgetreten ist ($errors != 0), folgt jetzt der default Teil
// d.h. das Eingabeformular wird nochmals angezeigt mit einer Fehlermeldung.
// ----------------------------------------------------------------------------
default:
?>
<h1 style="text-align:center;">Anmeldung zu einer Sonnen-Führung auf der Sternwarte Welzheim</h1>
<p>Diese Führung auf der Sternwarte Welzheim findet <strong>nur bei
klarem Himmel</strong> statt.
</p>
<p>
Bitte beachten Sie, dass der Weg zur Sternwarte Welzheim <strong>mit
Kraftfahrzeugen nicht befahren werden darf</strong>. Sie können
Ihre Fahrzeuge auf dem Parkplatz der Sternwarte abstellen. Von hier
führt ein 430 m langer Fußweg zur Sternwarte.
</p>
<p>Die Fernrohre in den Beobachtungskuppeln sind nur über Treppen zu
erreichen. Es besteht leider keine Möglichkeit, Rollstühle in die
Kuppeln mitzunehmen. Für Kleinkinder sind Sternführungen nicht
geeignet.</p>
<p>Betrieb und Arbeit auf der Sternwarte erfolgen ehrenamtlich.
Unterhalt und Aktivit&auml;ten auf der Sternwarte sind nur durch
Ihre Unterstützung m&ouml;glich. Wir bitten daher um eine ensprechende Spende.
</p>
<p>
An einer Führung können nur maximal <strong><?php echo $maxBesucher;?> Personen </strong>teilnehmen.
Sollte die von Ihnen ausgewählte Führung bereits ausgebucht sein, wählen Sie bitte
einen anderen Termin.
</p>
<p>
Sollte die Führung wegen des Wetters ausfallen, erhalten Sie bis
<strong>spätestens eine Stunde</strong> vor Führungsbeginn eine Email. Wir bitten
Sie, sich dann für einen neuen Termin nochmals anzumelden.
</p>
<p>
Wenn Sie alle Felder ausgefüllt und abgeschickt haben (mit dem "Anmeldung senden"-Knopf),
erhalten Sie eine Anmeldebestätigung per e-mail.
</p>
<p>
<?PHP echo $stern_error_msg ?>
</p>
<p class="sondermeldung">
Unsere Sternwarte bleibt bis voraussichtlich 14. November 2025 wegen neuer technischer Einrichtung
geschlossen. <br />Bis dahin können keine Führungen durchgeführt werden.
</p>
<strong>Anmeldung:</strong>
<span class="textklein">(Alle Felder mit '*' müssen ausgefüllt werden)</span><br />
<br />
<div id="formular" class="fltrt">
<form action="sonnenfuehrung.php#form" method="post">
<?
echo bauNextFuehrungen(getNextFuehrungen(), $maxBesucher, $stern_fdlink);
?>
<br />
<div id="unterfuedat" class="textklein">Bitte beachten Sie, dass eine
Anmeldung bis spätestens <? echo $vorlauf?> Stunden vor Führungsbeginn erfolgt sein muss!<br/>
Schon belegte Termine können nicht ausgewählt werden (sie werden grau dargestellt).</div><br/>
<br />
<label for="name" class="labeltext">Zuname *</label>
<input
type="text" maxlength="50" name="name"
value="<? echo $stern_name; ?>" id="name" class="textfeld200"/> <br/>
<label for="vorname" class="labeltext">Vorname</label>
<input
type="text" maxlength="50" name="vorname"
value="<? echo $stern_vorname; ?>" id="vorname" class="textfeld200"/><br/>
<br/>
<label for="strasse" class="labeltext"> Straße / Haus-Nr. *</label>
<input type="text" maxlength="60" name="strasse"
value="<? echo $stern_strasse; ?>" id="strasse" class="textfeld200"/><br/>
<label for="ort" class="labeltext">PLZ / Ort *</label>
<input
type="text" maxlength="5" name="plz" id="plz"
value="<?php echo $stern_plz; ?>" class="textfeld20"/>
<input
type="text" maxlength="60" name="ort" id="ort"
value="<?php echo $stern_ort; ?>" class="textfeld100"/> <br/>
<label
for="tel" class="labeltext"> Telefonnummer</label>
<input
type="text" maxlength="50" name="tel" value="<? echo $stern_tel; ?>"
id="tel" class="textfeld200"/> <br/>
<br />
<label for="mail" class="labeltext">E-Mail-Adresse *</label>
<input
type="text" maxlength="120" name="mail"
value="<? echo $stern_mail; ?>" id="mail" class="textfeld200"/><br />
<br />
<label for="teil" class="labeltext">Anzahl Personen*<br/> </label>
<input type="number" step="1" min="1" max="<? echo $maxProPerson ?>" maxlength="120"
name="teil" value="<? echo $stern_teil == "" ? "1" : $stern_teil; ?>" id="teil" class="textfeld20"/>
<span id="maxpro"
class="textklein">(max. <? echo $maxProPerson ?> Personen)</span>
<br />
<br />
<div id="bemerk">
<label for="remarks" class="labeltext">Bemerkungen</label>
<textarea name="remarks" id="remarks" rows="2" cols="40" class="textfeld200"></textarea><br/>
<br />
</div>
Eine Sonnenführung findet nur bei <b>klarem</b> Wetter statt.<br/>
<p>
<strong>Das Betreten der Sternwarte erfolgt auf eigene
Gefahr. Die Sonnenführung wird von ehrenamtlichen
Kräften durchgeführt. Bei Ausfall einer Führung kann kein Schadenersatz
geleistet werden.</strong>
</p>
<div id="sendebutton">
<input type="hidden" name="stern_actionstern" value="senden">
<input type="submit" name="submit" value="Anmeldung senden" class="inputtext">
</div>
<button type="button" class="inputtext cancel" onclick="window.location.href='/index.php';">Abbruch</button>
<br /><br />
<p>
Hinweis zum Datenschutz: <a href="" id="dschu">Datenschutzerklärung</a>
</p>
<p class="lastchange">Letzte Änderungen: 2025-10-22 rxf</p>
</form>
</div>
<?
// ----------------------------------------------------------------------------
} // Ende switch($page)
?>
<!-- end #mainContent -->
</div>
<!-- Dieses clear-Element sollte direkt auf das #mainContent-div folgen, um das #container-div anzuweisen, alle untergeordneten Floats aufzunehmen. -->
<br class="clearfloat"/>
<!-- end #container -->
</div>
</body>
</html>