Zur Startseite Um für den ersten Vergleich einige Beispieldaten zu haben, werden für die Gäste "Müller" und "Schmidt" entsprechende Daten eingetragen. Gespeichert wird jeweils der Anreise- und Abreisetag sowie die Zimmernummer und der Belegungstyp "reserviert".
// Zimmer 8 wird vom 1.4 bis 20.4 renoviert $sql = "insert into zimmer (id, nummer, status, anreise, abreise) values (0, 8, 'nicht verfügbar', '2001-04-01', '2001-04-20')"; mysql_query($sql);
In jedem guten Hotel können auch mal Zimmer nicht verfügbar sein, weil diese beispielsweise renoviert werden. Auch ein solches Beispiel wird als eigener Datensatz eingetragen.
Advertisement/Werbung
$anreise="2001-04-08";
$abreise="2001-04-11";
$ary = zimmer_frei($anreise, $abreise);
if (sizeof($ary) > 0)
{
echo "Ergebnis: Zimmer $ary[0] reservieren<br>\n";
} else {
echo "Leider kein Zimmer frei<br>\n";
}
echo "<hr>\n";
$anreise="2001-05-01";
$abreise="2001-05-03";
$ary = zimmer_frei($anreise, $abreise);
if (sizeof($ary) > 0)
{
echo "Ergebnis: Zimmer $ary[0] reservieren<br>\n";
} else {
echo "Leider kein Zimmer frei<br>\n";
}
echo "<hr>\n";
Für zwei Beispielabfragen werden Anreise- und Abreisetag festgelegt. Die Funktion zimmer_frei() prüft die Verfügbarkeit und gibt ein Array mit freien Zimmern zurück. Das erste Zimmer in diesem Array kann dann für die Reservierung (im nächsten Schritt) verwendet werden.
$sql = "SELECT nummer, status, name,
anreise, abreise FROM zimmer
where
('$anreise' BETWEEN date_add(anreise, INTERVAL 1 DAY)
AND DATE_ADD(abreise, INTERVAL -1 DAY))
OR
('$abreise' BETWEEN DATE_ADD(anreise, INTERVAL 1 DAY)
AND DATE_ADD(abreise, INTERVAL -1 DAY))
OR
(
('$anreise' <= anreise) AND
('$abreise' >= abreise)
)
GROUP BY nummer";
// echo $sql . "<br>";
$result = mysql_query($sql);
if (!$result) print ("Fehler: ".mysql_error()."<br>\n");
Die Funktion muss nun prüfen, ob in der angegebenen Zeit noch Zimmer verfügbar sind. Dies geschieht durch Ausschluss der belegten Zimmer. Jedes Zimmer, das nicht schon belegt ist, muss nämlich frei sein. Zur genauen Erläuterung der SELECT-Abfrage siehe weiter unten im Text.
print "Belegte Zimmer in der Zeit von
$anreise bis $abreise<br>\n";
show_result($result);
// nochmal abfragen, weil Ergebnis durch
// show_result schon ausgewertet wurde
$result = mysql_query($sql);
Um die Sache anschaulicher zu machen, werden die Zwischenergebnisse hier ausgegeben. Dieser Code fällt im zweiten Schritt wieder weg. Da beim Anzeigen der Ergebnisse die Ergebnismenge schon ausgewertet wird, muss die Abfrage anschliessend nochmal durchgeführt werden.
if (0 == mysql_num_rows($result))
{
// alle zimmer frei
$sql = "select nummer from zimmer
WHERE status='frei'";
} else {
// belegte zimmer nicht anzeigen
$sql = "select nummer from zimmer
where status='frei' and nummer not in (";
while ($items = mysql_fetch_array($result))
{
$sql .= $items['nummer'] . ",";
}
$sql = substr($sql, 0, strlen($sql)-1);
$sql .= ")";
}
echo $sql . "<br>";
$result = mysql_query($sql);
print "Freie Zimmer in der Zeit:<br>\n";
show_result($result);
Nachdem in der ersten Abfrage die belegten Zimmer bekannt sind, wird mit der zweiten Abfrage nach allen verfügbaren Zimmern gesucht, in denen die schon belegten nicht enthalten sind.
$result = mysql_query($sql);
while ($items = mysql_fetch_array($result))
{
$ary_result[] = $items['nummer'];
}
return $ary_result;
}
?>
</body>
</html>
Jetzt nur noch das Ergebnis in einem Array ablegen und zurückgeben.
