PHP und MySQL

ASchwiedy

Mitglied
Hallo Allerseits,

ich habe mir ein kleines Buchungsscript in PHP geschrieben. Dabei kann mein Kunde eine Buchung über ein Formular eingeben mit An- und Abreisetag. Das Ganze wird dann in eine MySQL Datenbank gespeichert. Die beiden Datum werden als date() gespeichert.

Das funktioniert:
z.B. Anreisetag: 01.01.2016 / Abreisetag 05.01.2016
-> in MySQL als 2016-01-01 und 2016-01-05 gespeichert.

In einem Kalender wird der Zeitraum als gebucht / belegt angezeigt. Der 01.01.2016 und 05.01.2016 werden dabei als "halfdays" angezeigt (ich nenn das jetzt mal so).


Das funktioniert nicht:
Bei einer weiteren Buchung soll abgefragt werden, ob der gewünschte Zeitraum noch frei ist. Dabei, und daran scheitere ich, sollen der Ab- und Anreisetag berücksichtigt werden.
D.h. wenn jetzt z.B. jemand vom 05.01.2016 bis 10.01.2016 buchen will, dann soll die Buchung genehmigt werden, da der 05.01.2016 ja scho wieder für eine Anreise frei ist (war bis jetzt ja nur ein Abreisetag). Oder noch komplexer: Es existert nun eine Buchung vom 01.01.bis 05.01. und eine weitere vom 10.01. bis 15.01. jetzt will jemand vom 05.01. bis 10.01. buchen. Das sollte möglich sein, da Zeitraum dazwischen frei. Andere Buchungen sollten natürlich abgeblockt werden.
Wie schaffe ich dafür eine vernünftige MySQL-Abfrage zu schreiben?

LG
Andi
 
Speicher noch die Zeit mit dazu (also DATETIME). Dann kannst du ja genau festlegen, dass die Abreise immer bis um 12 Uhr passiert ein muss (also Abreise 05.01.2016 12:00), und die Anreise immer erst um sagen wir mal 15:00 beginnt. So kannst du sehr einfach prüfen, ob der gewünschte Zeitraum noch frei ist.
 
Hallo ASchwiedy,

ohne eine Zeitangabe in der Datenbank muss man Umwege gehen.

Hier mal ein Referenzbeispiel.

SQL:
SELECT anreise,abreise FROM test WHERE anreise BETWEEN DATE_ADD('2016-01-05', INTERVAL +1 DAY) AND DATE_ADD('2016-01-10', INTERVAL -1 DAY)
OR abreise BETWEEN DATE_ADD('2016-01-05', INTERVAL +1 DAY) AND DATE_ADD('2016-01-10', INTERVAL -1 DAY)

Da keine Zeitangabe in der SQL-Tabelle gespeichert wird, habe ich den "neuen" Anreisetag um einen Tag erhöht und den Abreisetag um einen Tag verkleinert.
Somit ist es möglich, dass der Anreisetag (bsp. 05.01) sich in der Datenbank mit einem Abreisetag überschneiden kann. Gleiches gilt für den Abreisetag, sollte bereits ein "Bewohner" in einem Zimmer wohnen.

LG
 
Hallo und erstmal danke für die freundlichen Antworten!!!!

Ich habe nun versucht das mal anhand eines kleinen Scriptes nachzuvollziehen ohne mein Hauptscript zu verändern.
Für diesen Zweck habe ich eine neue kleine DB angelegt:
Name: test
id | von | bis
'von' und 'bis' sind wieder im date-Format

Darin habe ich nun zwei Einträge gespeichert:
1 | 2016-04-01 | 2016-04-05
2 | 2016-04-20 | 2016-04-26

habe also zwei Buchungen simuliert.

Nun wollte ich mittels PHP die Lösungsvorschläge testen:

PHP:
$sql=mysql_query("SELECT von,bis FROM test WHERE von BETWEEN DATE_ADD('2016-04-02', INTERVAL +1 DAY) AND DATE_ADD('2016-04-04', INTERVAL -1 DAY)
OR bis BETWEEN DATE_ADD('2016-04-02', INTERVAL +1 DAY) AND DATE_ADD('2016-04-04', INTERVAL -1 DAY)");

$anzahl=mysql_num_rows($sql);

if ($anzahl == 0) {
    echo ("Buchung möglich");
} else {
    echo ("Buchung nicht möglich");
}

Leider erhalte ich dabei immer 0 Einträge und somit "Buchung möglich"

Wäre es viel anders, wenn ich die Uhrzeit mit einfügen würde oder erreiche ich mit diesem Beispiel das Gleiche?
 
Hallo ASchwiedy,

im Query wird auf den Zeitraum zwischen dem 02.04.2016 und 04.04.2016 geprüft.
Da innerhalb dieses Zeitraums die ID 1 bereits ein Zimmer gebucht hat, soll die Buchung auch nicht möglich sein.

Wie sieht es mit dem Zeitraum 2016-04-05 bis 2016-04-10 aus?

Mit einer Uhrzeit wäre der Code sicher sauberer, vom Ergebnis her ändert sich jedoch nichts.

Es spielt keine große Rolle, ob man nun prüft ob 2016-01-01 13:00 größer ist als 2016-01-01 12:00.
Oder 2016-01-01 größer als (2016-01-01 +1 DAY)

Das Ergebnis am Ende ist identisch.

Das gilt jedoch nur solange, wie der Checkout- vor dem Checkin-Termin liegt.

LG
 
Hallo,

das alles mit Zeit umzuändern wäre im Nachhinein auch aufwendig.

Da innerhalb dieses Zeitraums die ID 1 bereits ein Zimmer gebucht hat, soll die Buchung auch nicht möglich sein.

korrekt so sehe ich das auch. Allerdings gibt mir das Testscript als Anzahl der gefundenen Einträge NULL aus und somit "Buchung möglich" was ja eigentlich nicht sein sollte.

LG
Andi
 
Nachtrag..
sehe ich das richtig? Ist ja auch logisch das dieses Ergebnis kommt.
In der DB ist eingetragen
von ->2016-04-01
bis -> 2016-04-05

Das Script sucht ja nun nach Einträgen die folgende Kriterien erfüllen:
ob 2016-04-01 (von) zwischen 2016-04-03 (2016-04-02 +1day) und 2016-04-03 (2016-04-04 -1day)
ODER
2016-04-05 (bis) zwischen 2016-04-03 (2016-04-02 +1day) und 2016-04-03 (2016-04-04 -1day) liegt

Da beides nicht zutrifft kommt auch "Buchung möglich"
 
Hallo ASchwiedy,

Du hast recht, ich habe es mir schwerer gemacht als es eigentlich ist.

Im Grunde muss man die Daten nur crosschecken:

Sind vorhandene Anreisen kleiner als meine Abreise / Sind Abreisen größer als meine Anreise.

SQL:
SELECT anreise,abreise FROM test
WHERE (anreise  < '2016-04-22' AND abreise > '2016-04-06')
 
Hallo nochmals,

ich denke so gehts leider nicht.

hab es jetzt so versucht:

In der DB ins ein Eintrag:
id | von | bis
1 | 2016-04-01 12:00:00 | 2016-04-05 11:59:59

PHP:
$anreise="2016-04-05 12:00:00";
$abreise="2016-04-11 11:59:59";

$sql=mysql_query("SELECT * FROM test WHERE (von <= '$anreise' AND bis >= '$anreise') OR
(von <= '$abreise' AND bis >= '$abreise') OR
(von >= '$anreise' AND bis <= '$abreise')");



$anzahl=mysql_num_rows($sql);

if ($anzahl == 0) {
    echo ("Buchung möglich");
} else {
    echo ("Buchung nicht möglich");
}

Scheint zu funktionieren. Oder bin ich auf den falschen Weg?

LG
Andi
 
Oder bin ich auf den falschen Weg?
In einer andere Sache außer dem Kernproblem, ja.
Die mysql_ - Funktionen in PHP sind abgeschafft. Deine PHP - Installation ist vermutlich veraltet
(und auch vor Entfernung gab es jahrelang Warnungen direkt in PHP drin, das nicht mehr zu verwenden)

Stattdessen gibt es Mysqli oder PDO.
 
Zurück