[PHP & MYSQL] reserveringskalender

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Hoi,

Ik ben bezig met een kleine site om een huisje te verhuren gedurende een jaar met een vaste tijd van een zaterdag tot een zaterdag. Nou heb ik een stukje code geschreven om een kalender weer te geven met de maanden onder elkaar en daarachter de verschillende dagen. Nou is het de bedoeling dat de achtergronden van de velden een kleur krijgen aan de hand van of het huisje vrij is of dat hij bezet is.

de code om de kalender op te bouwen ziet er momenteel deels zo uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    private function buildCalendar()
    {
        //loop through the months
        $month = 1;
        while($month <= 12)
        {
            $this->html .= "<tr><td>\n\r";
            $firstday = mktime(0, 0, 12, $month, 1, $this->year);
            $monthname = strftime("%B", $firstday);
            $totaldays = date("t", $firstday);
            $this->html .= $monthname . "</td>\n\r";
        
            //loop through the days in currentmonth
            $day = 01;
            while($day <= 31)
            {
                if($day <= $totaldays)
                {
                    $currentday = mktime(0, 0, 0, $month, $day, $this->year);
                    $day = str_pad((int) $day,2,"0",STR_PAD_LEFT);
                    if(strftime("%w", $currentday) == 6)
                    {
                        $this->html .= "<td class=\"saturday\" title=\"" . date("d-m-Y", $currentday) . "\">" . $day . "</td>\n\r";
                    }
                    else
                    {
                        $this->html .= "<td>" . $day . "</td>\n\r";
                    }
                }
                else
                { 
                    $this->html .= "<td></td>\n\r";
                }
                $day++;
            }
            $this->html .= "</tr>\n\r";
            $month++;
        }
    }


Mijn vraag is eigenlijk. hoe kan ik het beste een geboekte periode van een zaterdag tot zaterdag opslaan in mijn database en het vervolgens verwerken in mijn kalender.
Is het handig om simpelweg elke dag tussen de twee zaterdagen als dd-mm-yyyy in de database op te slaan met een boekings-id om te ze te koppelen en vervolgens in mijn kalendercode te kijken of de huidige dag in die array van geboekte dagen zit of denk ik helemaal verkeerd?

Ik loop er al een tijdje mee te stoeien maar ik heb geen idee wat een goede aanpak is.

Acties:
  • 0 Henk 'm!

Verwijderd

Eigenlijk is het heel simpel omdat je boekingen za-za zijn. Je kan dan gewoon de weeknummers of alleen de aankomstdatum opslaan in je database. Moet je er natuurlijk wel zeker van zijn dat je het za-za blijft doen.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Gebruik een DATETIME om de aankomst datum en tijd op te slaan en een DATETIME om de vertrek datum en tijd op te slaan. Op deze manier kun je vrij eenvoudig vaststellen wanneer iemand aankomt en wanneer deze weer vertrekt.

dd-mm-yyyy is geen datumformaat, net zo min als als een weeknummer. Gebruik gewoon datums met tijden, die zijn specifiek.

Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
KISS principe, gebruik unix timestamp.

Voordeel:
- Vaste opmaak
- Makkelijk mee te rekenen
- Niet vast aan periode ( Je kan ook weekenden of midweken gaan toepassen)
- Makkelijk toe te passen in query.

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

fleppuhstein schreef op maandag 16 februari 2009 @ 21:48:
KISS principe, gebruik unix timestamp.

Voordeel:
- Vaste opmaak
- Makkelijk mee te rekenen
- Niet vast aan periode ( Je kan ook weekenden of midweken gaan toepassen)
- Makkelijk toe te passen in query.
Let er wel op dat bij het gebruik van unix timestamps en daarmee gaat rekenen je er niet vanuit kan gaan dat een dag 86400 seconden duurt, dankzij winter- en zomertijd :r kan je dan opeens vreemde resultaten krijgen door dagen die plotseling een uur langer of korter duren.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Johnny schreef op maandag 16 februari 2009 @ 22:15:
[...]

Let er wel op dat bij het gebruik van unix timestamps en daarmee gaat rekenen je er niet vanuit kan gaan dat een dag 86400 seconden duurt, dankzij winter- en zomertijd :r kan je dan opeens vreemde resultaten krijgen door dagen die plotseling een uur langer of korter duren.
Dat gaat niet op aangezien Unix timestamp, seconds sinds epoch betreft in UTC timezone. En kent dus geen DST. Zelf bijhouden volgens de DST regels. Juist het gebruik van een DateTime met + 1 week, kan met winter zomer tijd onverwachte effecten geven.

[ Voor 10% gewijzigd door fleppuhstein op 16-02-2009 22:22 ]


Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Stel voor dat ik dus 2 velden in m'n database heb met een aankomst timestamp en een vertrek timestamp. Die stamp hoeft volgens mij niet op de seconde nauwkeurig te zijn gezien je in principe een hele dag overlap heb waarbij iemand vertrekt en iemand komt. Maar hoe krijg ik de bezette data dan uit de database en kan ik het verwerken in m'n code? Ik heb al zitten denken om gewoon het aantal weken naast de aankomstdatum in te vullen en dan gewoon bij houdt of de datum in de loop nog binnen de range van startdatum + aantal weken*7 zit maar dan kom ik volgens mij in de problemen wanneer iemand een vakantie boekt rond de jaarwisseling. die valt dan buiten m'n query.
Ik ben al een tijdje in de mysql docs en wat kalender scripts door te bladeren maar ik heb echt geen idee waar ik moet zoeken.

Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Een stukje oude code van mij. Het had hetzelfde doel. Met deze query werd gecontroleerd of het huis reeds bezet was in de geselecteerde periode:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$querytext = "  SELECT
                            *
                        FROM
                            reservations
                        WHERE
                            `houseid` = ".$postvalues['houseid']."
                        AND NOT
                            (   
                                `from` > '".$postvalues['enddate']."'
                                    OR 
                                `till` < '".$postvalues['startdate']."'
                            )
                        ;";

Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
Het lukt me wel om te controleren of de week nog vrij is op de opgevraagde data. als er een boeking in de database staat met de zelfde startdatum als de gevraagde dan is de week dus al bezet.
Ik kom er alleen niet uit hoe ik mijn kalender zo kan aanpassen zodat hij er uit gaat zien zoals bijvoorbeeld hier

mijn kalender ziet er nu net zo uit als bovenstaand alleen dan zonder de kleuren die aangeven of het huisje op de dag bezet of vrij is.

opties die al bedacht had:
* een tabel maken met daarin data in yyyy-mm-dd gekoppeld aan een boeking en die dan ophalen als array uit de database en vervolgens in de loop kijken of de huidige dag in die array staat. probleem is dan wel dat ik een array van maximaal 365 entries heb en ik heb geen idee wat dat qua performance doet.

* de aankomstdag opslaan en het aantal dagen dat de gast blijft en bijhouden of de huidige datum in de loop binnen dat bereik valt maar dan heb ik denk ik een probleem rond de jaarwisseling.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je een Array met boekingen ( start-datum, eind-datum ) ophaalt die gesorteerd is om start-datum, kun je vrij eenvoudig bepalen of een dag al gereserveerd is.

Je zoekt dan in de array de grootste startdatum op die kleiner is dan de dag die je wilt controleren. Als de eind-datum dan groter is als de dag die je wilt controleren is hij al geboekt, anders niet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

De regel voor $day++ een select doen zoals fleppuhstein zegt.
if bezet dan kleur a else kleur b.

(ik zit even op een werkplek waar je voorbeeldkalender restricted area is :( )

Dat betekent wel dat je ook daar pas moet evalueren welke dag je gaat echoen.

[ Voor 18% gewijzigd door Verwijderd op 17-02-2009 11:30 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 17 februari 2009 @ 11:27:
De regel voor $day++ een select doen zoals fleppuhstein zegt.
if bezet dan kleur a else kleur b.

(ik zit even op een werkplek waar je voorbeeldkalender restricted area is :( )

Dat betekent wel dat je ook daar pas moet evalueren welke dag je gaat echoen.
Nadeel daarvan is dat je voor elke dag een query moet doen. Ik zou gewoon alle reserveringen ophalen voor de periode dat je een kalender wil tonen, en aan de hand daarvan de kalender opbouwen, dan hoef je maar 1 query te doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1