Terminkalender / Eventkalender mit Datenbank verbinden

Anna89

Grünschnabel
Hallo Community,

ich bin neu hier und bitte um eure Hilfe. Bitte entschuldigt, falls dieses Thema schon öfter hier besprochen wurde. Ich suche bereits einige Tage bei google und auch hier in der Forensuche und werde fast wahnsinnig, da ich nicht die Lösung für mein Problem finde. Zwar sind genügend Artikel über das Thema vorhanden, aber nichts was mir weiterhilft. Deshalb wende ich mich an euch.

Ich habe mit Hilfe eines Tutorials einen Kalender in PHP erstellt. Er gibt den Monat und die Tage tabellarisch aus.

Jetzt habe ich zwei Probleme.

Ich möchte gerne den Monat weiterblättern. Also "<< Februar >>" und beim Klick auf die Pfeile den nächsten bzw. vorherigen Monat angezeigt bekommen. Theoretisch ist das ja nicht schwer, aber ich bekomme es einfach nicht hin.

Desweiteren möchte ich diesen Kalender an eine Datenbank anbinden, so dass bei einem Klick auf einen Tag ein Termin(e) oder die Ausgabe "keine Termine hinterlegt" ausgegeben werden.

Wie ich Daten über ein Formular in eine Datenbank eintragen kann weiß ich. Jedoch stelle ich mir das Auslesen schwierig vor, weil ja nur Daten eines bestimmten Datums ausgelesen werden sollen und nicht der komplette Inhalt.

Ich hoffe ich habe mein Problem verständlich rübergebracht.

Ich würde mich sehr über hilfreiche Tipps, Links oder Tutorials freuen. Da ich sehr bemüht bin das auch zu verstehen und PHP zu lernen, möchte ich den Kalender selbst erstellen und nicht auf ein fertiges Script zurückgreifen.

Vielen Dank schon einmal im Voraus.


Ich poste mal den Code, vielleicht ist das ja hilfreich.

PHP:
    <?php
    
        $zeit = time();
        $jahr = date("Y", $zeit);
        $monat = date("n", $zeit);
        $aktueller_tag = date("d", $zeit);
        $erster_tag = date("w", mktime(0,0,0,$monat,1,$jahr));
        $anzahl_tage = date("t", $zeit);
        
        $monate = Array("", "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
        $wochentage = Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
        
        if ($erster_tag == 0)
            {
                $erster_tag = 7;
                
            };


        echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
                
                <tr>
                    <td colspan=\"7\">" .$monate[$monat]. " $jahr</td>
                </tr>
                
                <tr>
                    <td>Mo</td>
                    <td>Di</td>
                    <td>Mi</td>
                    <td>Do</td>
                    <td>Fr</td>
                    <td>Sa</td>
                    <td>So</td>
                </tr>
                
                <tr>
                
             ";
             
        for ($leere_zellen = 1; $leere_zellen < $erster_tag; $leere_zellen++)
            {
                echo "<td></td>\n";
            };
            
        for ($eintrag = 1; $eintrag <= $anzahl_tage; $eintrag++)
            {
                
                $tag=$wochentage[date("w", mktime(0,0,0,$monat,$eintrag,$jahr))];
                
                                                
                echo "<td class=\"$style\">$eintrag</td>\n";
                
                
                if ($tag == "So") 
                    {
                        echo "</tr>\n\n<tr>\n";
                        
                    };            
                
            }
        
        echo "    </tr>
        
              </table>";                
        
    ?>


Viele Liebe Grüße

Anna
 
Für die Übergabe des Monats habe ich es so gemacht, daß der jeweils aktuelle Monat und Jahr und die Richtung per GET wieder an den Kalender übergeben werden. Im Moment würde es also so aussehen:
HTML:
<a href="kalender.php?month=2&year=2009&step=1">vorwärts</a>
bei rückwärts dann entsprechend step=-1. Wenn das Script dann in $_GET Daten gefunden hat, braucht das nur noch eingesetzt zu werden und der neue Timestamp steht fest.
PHP:
$zeit = mktime(0,0,0,$month+$step,1,$year);	// Rechenzeit auf Anfang des anzuzeigenden Monats setzen
Dadurch brauchst du dich auch nicht um den Jahreswechsel zu kümmern, da mktime das selbst übernimmt. Mit getdate($zeit) hast du dann auch wiedr alle relevanten Daten für den Monat zur Verfügung.

Für die Datenbankabfrage kommt es darauf an, ob du mehrtägige Ereignisse hast und ob du auch einzelne Tage anzeigen willst oder immer nur die Monatsübersicht. Bei Tagesansicht läßt du alle Einträge ausgeben, die für den Tag gelten, für die Monatsansicht muß der Monat des entsprechenden Tages mit dem Anzeigemonat übereinstimmen. Wenn du mehrtägige Ereignisse hast, mußt du natürlich noch die Überschneidungen mit einem Monatswechsel berücksichtigen. Dafür habe ich mir immer Zeichnungen gemacht mit allen zu berücksichtigenden Möglichkeiten.
Hier habe ich dieser Kalender verwendet:
Kalender
Wenn du was aus dem Quelltext brauchst, kann ich dir morgen weiterhelfen, wenn ich wieder im Büro bin.
 
Hallo Sprint,

vielen Dank für deine schnelle Antwort.

Das mit dem Monatsblättern klappt, allerdings gibt mir mein Kalender als aktuellen Monat (also wenn ich die Seite lade) Dezember 1999 statt Februar 2009 aus. Das Blättern dann aber funktioniert einwandfrei.

Ich habe praktisch hier:

HTML:
<a href="kalender.php?month=2&year=2009&step=1">vorwärts</a>

anstelle von "month=2" "month=$monat" und analog bei year das gleiche gemacht.

Also:

HTML:
<a href="kalender.php?month=$monat&year=$jahr&step=1">vorwärts</a>

Bei der Datenbankanbindung möchte ich keine Rücksicht auf mehrtägige Events nehmen. Die könnten ja auch für jeden Tag eingegeben werden. Ich denke, dass ich ohne das einfacher nachvollziehen kann wie es funktioniert (vorerst).

Ich würde mich riesig freuen, wenn du mir Auszüge aus dem Quelltext deines Kalenders geben könntest. Ich müsste halt irgendwie wissen, wie ich die einzelnen Tage mit der Datenbank verbinde und die Ereignisse für die jeweiligen anzeigen lasse.

Ich danke dir schoneinmal sehr für deine Hilfe.

Liebe Grüße

Anna
 
Wie holst du denn das aktuelle Datum bei Start der Seite? Wenn die Serverzeit nicht völlig verdreht ist, kann es nur daran liegen.

Das mit der Datenbank ist dann relativ einfach. Ich nehme mal an, daß du das jeweilige Datum in einem date Feld gespeichert hast. Für einen einzelnen Tag sieht die entsprechende Abfrage dann so aus.
PHP:
// $datum ist der anzuzeigende Tag
$sql="select * from events where to_days(datum) = to_days('$datum');";
Für eine ganze Woche mußt du erst einmal die Zeiten für die Woche bestimmen.
PHP:
if ($thisw){			// wenn diese Woche gewählt
	$wochentag = date("w",time());
	if ($wochentag == 0)
		$wochentag = 7;
	$zeit = mktime(0,0,0,date("n",time()),date("d",time())-$wochentag+1,date("Y",time()));	// Rechenzeit auf Wochenanfang setzen
}
if ($nextw){			// wenn nächste Woche gewählt
	$wochentag = date("w",time());
	if ($wochentag == 0)
		$wochentag = 7;
	$zeit = mktime(0,0,0,date("n",time()),date("d",time())-$wochentag+8,date("Y",time()));	// Rechenzeit auf nächsten Wochenanfang setzen
}

$wochestart = date("Y-m-d",$zeit);
$wocheende = date("Y-m-d",$zeit + (6 * 86400));		// Wochenanfang + 6 * 86400 Sek. / Tag
$sql = "select * from events where to_days(datum) >= to_days('$wochestart') and to_days(datum) <= to_days('$wocheende') order by datum;";

Bei der Monatsliste ist es dann wieder einfacher, da du da nur den Monat abfragen mußt.
PHP:
$sql = "select * from events where month(datum) = '$month' and year(datum) = '$year' order by datum;";
Da du keine mehrtägigen Ereignisse hast, habe ich die Abfragen entsprechend abgespeckt. Hab es also nicht getestet, hoffe aber trotzdem, daß es stimmt. Wenn noch was unklar ist, sag Bescheid.
 
Hallo Sprint,

erstmal vielen vielen Dank für deine Hilfe und Mühe.

Ich hole das aktuelle Datum über

PHP:
$zeit = time();
        $jahr = date("Y", $zeit);
        $monat = date("n", $zeit);
        $aktueller_tag = date("d", $zeit);
        $erster_tag = date("w", mktime(0,0,0,$monat,1,$jahr));
        $anzahl_tage = date("t", $zeit);

in die Seite.

Ich habe irgendwo gelesen, dass auf Systemen die time_t als 32Bit-Integer abbilden der gültige Bereich für den Parameter Jahr irgendwo zwischen 1901 und 2038 liegt, ansonsten zwischen 1970 und 1999. Das ist bei mir vielleicht so!?

Ich werde mich jetzt mal mit dem Code beschäftigen den du gepostet hast. Ich hoffe ich verstehe ihn. Bin schon voll am verzweifeln.

Viele liebe Grüße

Anna
 
PHP:
$zeit = time();
        $jahr = date("Y", $zeit);
        $monat = date("n", $zeit);
        $aktueller_tag = date("d", $zeit);
        $erster_tag = date("w", mktime(0,0,0,$monat,1,$jahr));
        $anzahl_tage = date("t", $zeit);

Ich habe irgendwo gelesen, dass auf Systemen die time_t als 32Bit-Integer abbilden der gültige Bereich für den Parameter Jahr irgendwo zwischen 1901 und 2038 liegt, ansonsten zwischen 1970 und 1999. Das ist bei mir vielleicht so!?
Hi Anna,

das liest sich eigentlich ganz richtig. Am time() kann man normal auch nix verkehrt machen. Laß dir doch time() einfach mal per echo ausgeben. Sollte eine Zahl bei rauskommen, die mit 123 anfängt. Ansonsten kannst du auch das mal ausprobieren.
PHP:
strtotime("now")
Das bringt auch die aktuelle Zeit.
Von diesen Bereichen habe ich zwar noch nichts gehört, aber ich kann mir auch nicht vorstellen, daß jemand freiwillig solch ein super veraltetes System fährt. Kann ja fast nur ein Windows 3.1 Server sein.
Ansonsten solltest du mal bei deinem Provider nachfragen und evtl. zu einem anderen wechseln, der der was neueres als 286er benutzt. Oder fährst du das lokal? Dann könnten vielleicht die Umgebungseinstellungen falsch sein.

Wenn sonst noch was unklar ist, einfach fragen.
Viel Spaß beim probieren.
 
Zurück