[php] kalender

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik ben bezig met een kalender te maken, maar nu zit ik met een probleem. je moet namelijk evenementen kunnen toevoegen over een paar dagen/maanden. dus het kan ook voorkomen dat er een jaar tussen zit (overgang van 2004/2005 bijv).

maar hoe ontdek ik of de start datum hoger is dan de eind datum, en of het in een ander jaar tal ligt. zoals ik het nu heb verschijnt het zo. 30-12-04, 2-1-05, wat dus goed is, maar het verschijnt ook op 30-12-05.

dit heb ik nu.

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
$year           = isset($_GET['year'])  ? (int) $_GET['year']   : date("Y");
$month          = isset($_GET['month']) ? (int) $_GET['month']  : date("n");

$db->query("SELECT * FROM events WHERE start_month >= $month OR end_month <= $month");
while($row = $db->fetch_assoc())    {
    if(($row['start_year'] != $year && $row['end_year'] != $year) && !$row['always'])
        continue;       
    
    if($row['end_month'])
    {
        $days   = (mktime(0,0,0,$row['end_month'],$row['end_day'],$row['end_year']) - mktime(0,0,0,$row['start_month'],$row['start_day'],$row['start_year']))/86400; 
        $day    = mktime(0,0,0,$row['start_month'],$row['start_day'],$row['start_year']);
        
        for($i = 0; $i <= $days; $i++)
        {
            $events[date('n j', $day)]['events'][]      = htmlentities(stripslashes($row['event']));
            $events[date('n j', $day)]['background']    = $row['color'];
            
            $day += 86400;
        }
    }
    else
    {
        $events[$row['start_month'].' '.$row['start_day']]['events'][]      = htmlentities(stripslashes($row['event']));
        $events[$row['start_month'].' '.$row['start_day']]['background']    = $row['color'];
    }
}


dit is me tabel

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE `events` (
  `event_id` int(11) NOT NULL auto_increment,
  `start_day` int(11) NOT NULL default '0',
  `start_month` int(11) NOT NULL default '0',
  `start_year` int(11) NOT NULL default '0',
  `end_day` int(11) NOT NULL default '0',
  `end_month` int(11) NOT NULL default '0',
  `end_year` int(11) NOT NULL default '0',
  `color` varchar(7) NOT NULL default '',
  `event` varchar(255) NOT NULL default '',
  `always` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`event_id`),
);

[ Voor 15% gewijzigd door Verwijderd op 11-05-2004 11:52 ]


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Zou je niet met dates gaan werken in je database? Dan kun je de gewoon met datums werken zoals je dat in je hoofd ook doet, dus 1 januari 2005 is later dan 31 december 2004 enzo.

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 19-09 09:34

thomaske

» » » » » »

Waarom maak je geen gebruik van de DATE / DATETIME velden van mysql (ik neem aan dat je met mysql werkt?). Dat scheelt al een hoop ingewikkelde vergelijkingen

[ Voor 16% gewijzigd door thomaske op 11-05-2004 12:01 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Misschien is het een idee om met Unix timestamps te werken. Vind ik persoonlijk ideaal voor tijd/datum zaken. Dat scheelt je een hoop logica zelf bouwen waarin nu iets fout gaat. Dag 2 komt na dag 1 als

a) jaar2 > jaar1
of
b) jaar2 == jaar1 && maand2 > maand1
of
c) jaar2 == jaar1 && maand2 == maand1 && dag2 > dag1

lijkt me dit makkelijker:
timestamp2 > timestamp 1

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Je kan ook alleen de evenementen opslaan in je DB, en php kent een aantal erg goede functies voor data en tijd. En unix timestamps is hetgene dat je nodig hebt.

kalender elke keer dynamisch laten weergeven. Moet niet zo moeilijk zijn

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

T-MOB schreef op 11 mei 2004 @ 12:02:
Misschien is het een idee om met Unix timestamps te werken. Vind ik persoonlijk ideaal voor tijd/datum zaken. Dat scheelt je een hoop logica zelf bouwen waarin nu iets fout gaat. Dag 2 komt na dag 1 als

a) jaar2 > jaar1
of
b) jaar2 == jaar1 && maand2 > maand1
of
c) jaar2 == jaar1 && maand2 == maand1 && dag2 > dag1

lijkt me dit makkelijker:
timestamp2 > timestamp 1
Timestamps zijn daar niet voor bedoeld en hebben zeker in MySQL wat nare bijwerkingen zoals auto-update op het eerste Timestamp veld. (Omdat ze dus bedoeld zijn als 'timestamp' voor wijzigingen op een record, niet om beheerbare datum/tijd informatie in op te slaan).

De "timestamp2 > timestamp 1" werkt ook prima met DATE en DATETIME velden, dus dat is ook geen reden om het te doen.

Verder kun je als je de database bekijkt een stuk eenvoudiger zien welke data ingevoerd zijn als je DATE/DATETIME gebruikt.

Als je in PHP met timestamps wilt werken kun je alsnog eenvoudig UNIX_TIMESTAMP() gebruiken in je query.

[ Voor 7% gewijzigd door Bosmonster op 11-05-2004 12:47 ]


Acties:
  • 0 Henk 'm!

  • Stubby
  • Registratie: Januari 2002
  • Laatst online: 15:09
Hier stonds iets heel stoms :S

[ Voor 89% gewijzigd door Stubby op 11-05-2004 12:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Laatst precies hetzelfde meegemaakt, moest zeer geavanceerde kalender maken.
Met de volgende code krijg je alle zogeheten `to-do items` in een array.
Kijk zelf maar even wat er uit komt.
De tabel structuur spreekt voor zich.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$month = $_GET['month'];
$year = $_GET['year'];

if ((!$year) || ($year < 1970) || ($year > 2037) || (!is_numeric($year))) {$year = date('Y'); }
if ((!$month) || ($month < 1) || ($month > 12) || (!is_numeric($month))) { $month = date('m'); }

$days = array('monday','thursday','wednesday','tuesday','friday','saturday','sunday');
$months = array('January','February','March','April','May',
'June','July','August','September','October','November','December');

$month_end = date('t',mktime(0,0,0,$month+1,0,$year));
$dagEerste = mktime('', '', '', $month, 1, $year);
$dagLaatste = mktime('', '', '', $month, $month_end, $year);

$SelectOptionsQuery = "
               SELECT
                     id,
                     omschrijving,
                     begin,
                     eind
               FROM
                     tb_driversoptions
               WHERE
                     (
                     (begin BETWEEN ".$dagEerste." AND ".$dagLaatste.")
               OR
                     (eind BETWEEN ".$dagEerste." AND ".$dagLaatste.")
               OR
                     (begin < ".$dagEerste." AND eind > ".$dagLaatste.")
                     )
               ";
$SelectOptionsResult = mysql_query($SelectOptionsQuery) or die (mysql_error());
$agendaData = array();
while(list($id, $omschrijving, $begin, $eind) = mysql_fetch_row($SelectOptionsResult))
{

    $dagStart   = date('j', $begin);
    $dagEind    = date('j', $eind);
    $maandStart = date('n', $begin);
    $maandEind  = date('n', $eind);
    $jaarStart  = date('Y', $begin);
    $jaarEind   = date('Y', $eind);

    if($maandEind > $month OR $jaarEind > $year)
      $dagEind = $month_end;
      
     if($maandStart < $month OR $jaarStart < $year)
       $dagStart = 1;

    for($i = $dagStart; $i <= $dagEind; $i++)
    {
        $agendaData[$i][] = $omschrijving;
    }

}

Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik gewoon altijd unix timestamps (dus het aantal seconden vanaf 1970) die ik in mysql opsla in een integer veld.
time() en date() alsmede mktime() dus. Ik vind dit het fijnste werken.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 11 mei 2004 @ 13:19:
Ik gebruik gewoon altijd unix timestamps (dus het aantal seconden vanaf 1970) die ik in mysql opsla in een integer veld.
time() en date() alsmede mktime() dus. Ik vind dit het fijnste werken.
Waarom gebruik je dan niet gewoon het date datatype icm de unix_timestamp functies van mysql? Op die manier kun je een datatype gebruiken dat bij de data hoort, is het ook duidelik waneer je ff via phpmyadmin of de console in de db kijkt. Kun je de data functies van mysql bekijken, en last but not least, gewoon gebruik blijven maken van de op unix timestamp gebaseerde functies in php.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Bosmonster schreef op 11 mei 2004 @ 12:46:
[...]

Timestamps zijn daar niet voor bedoeld en hebben zeker in MySQL wat nare bijwerkingen zoals auto-update op het eerste Timestamp veld. (Omdat ze dus bedoeld zijn als 'timestamp' voor wijzigingen op een record, niet om beheerbare datum/tijd informatie in op te slaan).
Ik sla mijn timestamps in een int(10). Ik ga er vanuit dat MySQL die gewoon intact laat na een (auto-)update, anders wordt het tijd voor een andere db denk ik...
De "timestamp2 > timestamp 1" werkt ook prima met DATE en DATETIME velden, dus dat is ook geen reden om het te doen.

Verder kun je als je de database bekijkt een stuk eenvoudiger zien welke data ingevoerd zijn als je DATE/DATETIME gebruikt.

Als je in PHP met timestamps wilt werken kun je alsnog eenvoudig UNIX_TIMESTAMP() gebruiken in je query.
Dat het ook werkt met DATE en DATETIME snap ik, maar waarom zou je de zaken gaan converteren als je in PHP werkt met timestamps? (input->timestamp; bewaren -> DATE; output -> timestamp) komt een beetje onzinnig op mij over.

De enige reden die je dus overhoudt is dat het overzichtelijker is wanneer je direct in je database gaat snuffelen. Dat doe ik doorgaans niet ;), eigenlijk alleen om scriptfoutjes te herstellen. Maar goed het is maar net wat je fijn vindr denk ik

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb het btw al opgelost, zal morgen als ik er aan denk posten hoe ik het gedaan heb, want ben nu thuis, en heb het gemaakt op me stage :)

werkt wel met UNIX_TIMESTAMP() trouwens. ;)
Pagina: 1