[mysql/php] logica en sql probleem reservatie systeem

Pagina: 1
Acties:
  • 153 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Ik ben al 1 week bezig met het maken van een reservatie systeem voor een klein hotel. Bijna alles loopt al op rolletjes maar ik zit vast met wat queries.

Eerst een beeld, ik heb twee tabellen: bedrooms en reservations

bedrooms
-------------
room_id | room_type | room_type_id |
_______________________________
3 | Suite Single | 22
4 | Suite Single | 22
5 | Suite Double | 33


reservations
----------------
room_id | room_type_id | date_from | date_till
________________________________________
3 | 22 | yyyy-mm-dd | yyyy-mm-dd
5 | 33 | yyyy-mm-dd | yyyy-mm-dd


Het reservatie form geeft aan:

Room: krijg je dropdown menu met alle kamers uit 'bedrooms' tabel
Datum van: yyyy-mm-dd
Datum tot: yyyy-mm-dd

Bij submit word het room_type_id van de gekozen kamer gestuurd en de datums. Nou mijn probleem is meer een logica als sql probleem:

1. Als er meerdere 'Suite Single' kamers zijn komen ze allemaal in het dropdown menu, ik wil graag van elke room_type alleen maar 1 keer in het lijst. Maar geen idee hoe ik dat aanpak.

2. Er word gekeken in de 'reservations' tabel als de bepaalde room_type beschikbaar is op de gekozen datum. Momenteel werkt het checken op gekozen datums goed. Maar nu moet hij ook kijken als er een kamer van die room_type beschikbaar is. Als er een beschikbaar kamer is van die room_type moet hij de room_id van die beschikbaar kamer terug geven. En daar loop ik vast.

Misschien is mijn opzet van de 'bedrooms' tabel ook niet goed, ik word er niet veel wijs van. Ik heb al verschillende forums en google gesearched maar heb niks helpzaam gevonden.

Hier is het query dat kijkt als de kamer beschikbaar is. Het geeft een error dus er zit wat fout:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$avail = ("SELECT * FROM reservations, bedrooms WHERE
      reservations.room_type_id = '$type' AND reservations.room_id IS NOT    
      bedrooms.room_id AND
                 '$from' <= reservations.date_from AND '$till' >= reservations.date_from
            OR '$from' <= reservations.date_till AND '$till' >= reservations.date_till
            OR '$from' >= reservations.date_from AND '$till' <= reservations.date_till");
                           
      $check_avail = mysql_query($avail) or die (mysql_error());
      
            if (mysql_num_rows($check_avail)) { //Room is not available
                 
              $message = "No rooms available";
                  
                  return $message;   }
                  
                  else {// There is a room available
                  
                     $message = "There is a room available";
                     
                     return $message;  }


Best ingewikkeld allemaal maar ik ben ten einde van raad, misschien iemand die wat weet?

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Heeft je reservation tabel geen autonumber primairy key? Je kunt dus niet 2 reservaties voor 1 kamer hebben. Dit lijkt me niet zo handig.

Antwoord op je 1e punt:

Gebruik een distinct select query, dus zoiets als SELECT DISTINCT ROOMTYPE FROM ROOMTYPES.

Misschien is het aardig om een ERD'tje o.i.d. van je tabellen te maken. Dan zie je wat duidelijker de verbanden.

[ Voor 50% gewijzigd door Noork op 24-11-2004 16:48 ]


Acties:
  • 0 Henk 'm!

  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 21-07 01:24

Fatamorgana

Fietsen is gezond.

Met GROUP BY room_type_id kun je dubbele waardes samenvoegen.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik vind zowiezo je tabellen opzet een beetje vreemd eerlijk gezegd. Ik zou een extra tabel room_type maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bedrooms
-------------
room_id | room_type_id
_______________________________
3 | 22
4 | 22
5 | 33


room_types
---------------
room_type_id | name
_______________________________
22 | Suite Single
33 | Suite Double


reservations
----------------
reservation_id | room_id | date_from | date_till
________________________________________
1 | 3 | yyyy-mm-dd | yyyy-mm-dd
2 | 5 | yyyy-mm-dd | yyyy-mm-dd


Verder heb ik het room_type_id uit de reservations gehaald omdat dit te achterhalen is via de bedrooms tabel.

Ik ga je post nu even verder lezen dus zo meer ;)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
@Noork: ja reservations tabel heeft een auto_increment unique id, resrevations_id. Ik heb phpmyadmin, ik zie niet waar ik een ERD'tje kan maken.


@Michali: jou tabel indeling heeft idd meer logica, ff wat mee doen kijken hoe het lukt.
-----------------------

Ok heb wat aanpassingen gedaan. Mijn tabel opzet is zoals aangegeven word door Michali. Formulier displayed nu mooi 1 van elk kamer. Nou blijft het query over.

Volgens mij moet aangegeven worden dat in de reservations tabel alleen naar datums word gekeken van de gekozen room_type. Maar hij moet ook rekening houden dat er meerdere kamers zijn onder 1 room_type. Als er wel een kamer beschikbaar is moet hij de room_id terug geven.

[ Voor 50% gewijzigd door Ms_Hyde op 24-11-2004 17:18 . Reden: bijgewerk ]

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Acties:
  • 0 Henk 'm!

Verwijderd

Ms_Hyde schreef op woensdag 24 november 2004 @ 16:57:
@Noork: ja reservations tabel heeft een auto_increment unique id, resrevations_id. Ik heb phpmyadmin, ik zie niet waar ik een ERD'tje kan maken.
Entity relations Diagram maak je op papier.
Dit geeft je inzicht hoe je tabellen t.o.v elkaar gerelateerd zijn. Als je dat direct gedaan had was je denk ik niet op dit probleem gestuid. Op het web zijn veel tutorials op dit gebeid. Lees ze eens, erg interessant, succes ! :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 24 november 2004 @ 19:25:
Entity relations Diagram maak je op papier.
Dit geeft je inzicht hoe je tabellen t.o.v elkaar gerelateerd zijn. Als je dat direct gedaan had was je denk ik niet op dit probleem gestuid. Op het web zijn veel tutorials op dit gebeid. Lees ze eens, erg interessant, succes ! :)
Handiger, als je niet van tekenen houdt, is misschien het maken van een LGS. Dat is namelijk puur tekst, en is meteen wat gedetailleerder. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Oh ok begrijp wat jullie bedoelen. Ja ik heb de tabellen en relaties getekend op klad. Maar somehow niet ingezien met dat aantal kamers per type apart moesten.

Maar de tabellen zijn nu wel goed en alles. Alleen het sql query om te kijken welke beschikbaar is ,etc moet ik uitzoeken.

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


Verwijderd

ik zou om het wat makkelijker te maken, het groepid ook in de reservations te zetten, ga er wel vanuit, dat je het positief bekijkt, en dus elke kamer is vrij tenzij anders gevonden.

ga ff puzzelen, kom ik nog op terug

edit: ok die staat er dus al in, ik zou al neigen naar een volgende select

select * from bedrooms where room_id NOT IN ( select room_id from reservations where bla bla = bla AND enz.........);

het kan ook nog via joins, maar daar ik pas een weekje bezig ben met php/mysql,
durf ik daar geen uitspraken over te doen.......

Ron
P.S. wel daarvoor geprogrameerd in: cobol, synergy, hypercard(mac), oracle, ASp/Access en nu dan php/mysql

[ Voor 58% gewijzigd door Verwijderd op 25-11-2004 00:55 ]


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Vergeet ook niet de haakjes om de logica van elkaar te scheiden. Ik weet eerlijk gezegd niet of SQL aan de OR of de AND de prioriteit geeft bij evaluatie, maar het is natuurlijk het beste om daar niet op te rekenen. Dus:

PHP:
1
2
3
"... ('$from' <= reservations.date_from AND '$till' >= reservations.date_from)
OR ('$from' <= reservations.date_till AND '$till' >= reservations.date_till)
OR ('$from' >= reservations.date_from AND '$till' <= reservations.date_till)"

[ Voor 14% gewijzigd door Haploid op 25-11-2004 09:18 ]

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • Ms_Hyde
  • Registratie: Februari 2002
  • Laatst online: 28-08 09:10
Haploid schreef op donderdag 25 november 2004 @ 09:16:
Vergeet ook niet de haakjes om de logica van elkaar te scheiden. Ik weet eerlijk gezegd niet of SQL aan de OR of de AND de prioriteit geeft bij evaluatie, maar het is natuurlijk het beste om daar niet op te rekenen. Dus:

PHP:
1
2
3
"... ('$from' <= reservations.date_from AND '$till' >= reservations.date_from)
OR ('$from' <= reservations.date_till AND '$till' >= reservations.date_till)
OR ('$from' >= reservations.date_from AND '$till' <= reservations.date_till)"
Deze stuk code werkt goed, het gaat bij mij om dat hij de datums alleen voor de gevraagde type room check en als er plek is dat hij een room_id terug geeft....

MacBook Pro 2019 | Oppo Reno 2 | Panasonic Lumix TZ70


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Ms_Hyde schreef op donderdag 25 november 2004 @ 14:53:
[...]
Deze stuk code werkt goed, het gaat bij mij om dat hij de datums alleen voor de gevraagde type room check en als er plek is dat hij een room_id terug geeft....
Nee, echt waar, dat stuk code is niet goed. Het gaat hier om operator precedence. In zo'n lange WHERE statement met meerdere ANDs en ORs moet MySQL kiezen welke logische operatoren hij eerst toepast. Ik heb het even opgezocht op http://dev.mysql.com/doc/mysql/en/Operator_Precedence.html en daar las ik dat AND de hogere precence heeft. 't-Is het bekende verhaal van "meneer van dalen wacht op antwoord", maar dan met een stuk meer operatoren. Dus als AND eerst wordt bekeken, dan is jouw code (zie onder) gelijk aan het voorbeeld dat ik daaronder heb geplakt. En dat is dus NIET wat je wilt.
SQL:
1
2
3
4
5
6
WHERE
reservations.room_type_id = '$type' AND reservations.room_id IS NOT bedrooms.room_id AND '$from' <= reservations.date_from AND '$till' >= reservations.date_from
OR 
'$from' <= reservations.date_till AND '$till' >= reservations.date_till
OR 
'$from' >= reservations.date_from AND '$till' <= reservations.date_till

Is functioneel gelijk aan:
SQL:
1
2
3
4
5
6
WHERE
( reservations.room_type_id = '$type' AND reservations.room_id IS NOT bedrooms.room_id AND '$from' <= reservations.date_from AND '$till' >= reservations.date_from )
OR 
( '$from' <= reservations.date_till AND '$till' >= reservations.date_till )
OR 
( '$from' >= reservations.date_from AND '$till' <= reservations.date_till )

Ik geef toe dat het niet het antwoord op je vraag is, maar als je dit niet verandert, zal het nooit werken. Ik raad je aan om goed te kijken naar wat ronhelm heeft geschreven; dat ziet er uit als een goed begin.

Hey, I came here to be drugged, electrocuted and probed, not insulted.

Pagina: 1