Ankündigung

Einklappen
Keine Ankündigung bisher.

Event Kalender - Zeitraum anzeigen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Event Kalender - Zeitraum anzeigen

    Hallo Experten,

    ich bin leider noch ein Anfänger in Sachen PHP. Ich bin aber, denke ich, auf einem guten Weg.

    Ich bastele mir gerade einen Event-Kalender und komme an einer Stelle nicht weiter. Der Kalender funktioniert und ich kann auch die Events im Kalender markieren, allerdings bekomme ich es einfach nicht hin den ganzen Zeitraum eines Events im Kalender zu markieren.
    Ich habe es mit BETWEEN und einer Schleife versucht, bekomme es aber nicht hin. Vielleicht liegt es an der Aufteilung von Jahr, Monat und Tag.
    Vielleicht habt ihr eine Lösung für mich, mit der ich weiter komme.

    Vielen Dank im Voraus!



    PHP-Code:
    <?php

    $days 
    = Array("So""Mo""Di""Mi""Do""Fr""Sa");
    echo 
    "<table border=\"1\" cellpadding=\"5\"><tr>\n";
    foreach (
    $days as $day) {
        echo 
    "<td style=\"background-color: #0092d0; text-align: center; width: 14%\">
              <strong>
    $day</strong></td>\n";
    }

    for (
    $count=0$count < (6*7); $count++) {
        
    $dayArray getdate($start);
        if ((
    $count 7) == 0) {
            if (
    $dayArray["mon"] != $month) {
                break;
            } else {
                echo 
    "</tr><tr>\n";
            }
        }
        if (
    $count $firstDayArray["wday"] || $dayArray["mon"] != $month) {
            echo 
    "<td> </td>\n";
        } else {
            
    $chkEvent_sql "SELECT * FROM calendar_events WHERE month(event_start) = '".$month."' AND dayofmonth(event_start) = '".$dayArray["mday"]."' AND year(event_start) = '".$year."' ";
            
    $chkEvent_res mysql_query($chkEvent_sql$mysql) or die(mysql_error($mysql));


            if (
    mysql_num_rows($chkEvent_res) > 0) {
                
    $event_title "<br/>";
                
                while (
    $ev mysql_fetch_array($chkEvent_res)) {
                        
    $event_title .= stripslashes($ev["event_title"])."<br/>";
                        
    $hlight "style=\"background-color: #929eba; ";
                }

                
    mysql_free_result($chkEvent_res);
            } else {
                
    $event_title "";
                
    $hlight"";
            }

            echo 
    "<td ".$hlight." valign=\"top\"><a href=event.php?m=".$month."&d=".$dayArray["mday"]."&y=$year\">".$dayArray["mday"]."</a><br/>".$event_title."</td>\n";


            unset(
    $event_title);
            unset(
    $hlight);
        

            
    $start += ADAY;
        }
    }
    echo 
    "</tr></table>";
    mysql_close($mysql);


    ?>

  • #2
    Dein Query überprüft doch auch nur event_start?

    Du kannst deine Events nach event_start sortieren und in deiner Wochen-Schleife alle Events vom Starttag bis Endtag ausgeben. Dazu brauchst du ein neues Array wo du die Events reinpackst sobald das Anfangsdatum ereeicht ist und beim Enddatum wieder rauswirfst.

    Ansonsten würde ich dir empfehlen deinen Events IDs zu geben, da Tag/Monat/Jahr als Identifizierung spätestens dann scheitert wenn es an einem Tag zwei Events gibt

    Kommentar


    • #3
      Hinweise:

      Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
      Choosing an API
      Warum man mysql* generell nicht (mehr) nutzen sollte.
      Wie man von mysql* auf PDO umsteigt
      Wissenswertes zum Thema SQL-Injection

      Die Verwendung von "*" in SQL-Abfragen wird im Allgemeinen als schlechter Stil angesehen. "*" kann entweder alle Felder aus einer Tabelle, oder (wenn mehrere Tabellen mit einbezogen werden) aus allen Tabellen ziehen.

      Zwei Gründe sprechen dagegen: Wenn du dein Tabellenschema anpasst, wird die Abfrage weiterhin funktionieren. Die Abfrage wird in deinem Code aber Variablen (bzw. Array-Keys) erzeugen, die von deinem Programm so nicht erwartet werden. Das kann (je nachdem, wie deine Applikation aufgebaut ist) zu schwer nachvollziehbaren Problemen führen. Würdest du die Spaltennamen direkt in deiner SQL-Abfrage angeben, würde die SQL-Abfrage direkt lautstark fehlschlagen. Dann kannst du möglicherweise einen Alias für umbenannte Tabellenspalten angeben, ohne dass du deinen Applikationscode anpassen musst.

      Außerdem kann man durch eine explizite Angabe die Reihenfolge und die Anzahl der Tabellenspalten begrenzen. Die Reihenfolge kann je nach Applikation eine Rollen spielen und je weniger Felder man einbezieht, desto schneller wird das Ergebnis zum abfragenden Client übertragen.

      Der schließende Tag eines PHP-Blocks am Ende einer Datei ist optional. In einigen Fällen ist das Weglassen hilfreich:
      • Es können ungewollte Whitespaces am Ende einer Datei auftreten, durch die ein späteres setzen von headern be-/verhindert werden kann.
      • Außerdem verhindert dies, dass beim Output Buffering Whitespaces am Ende eines durch die eingebundenen Dateien erzeugten Parts.
      • Im PSR Standard (PSR-2) ist ?> sogar ausdrücklich verboten, wenn in einer Datei ausschliesslich PHP verwendet wird (2.2 Files).


      Zudem ist es besser, wenn man den HTML-Output in ein eigenes Template packt. Sobald man beides vermischt, wird beides weniger wartbar.

      Kommentar


      • #4
        Zitat von Durin Beitrag anzeigen
        Dein Query überprüft doch auch nur event_start?

        Du kannst deine Events nach event_start sortieren und in deiner Wochen-Schleife alle Events vom Starttag bis Endtag ausgeben. Dazu brauchst du ein neues Array wo du die Events reinpackst sobald das Anfangsdatum ereeicht ist und beim Enddatum wieder rauswirfst.

        Ansonsten würde ich dir empfehlen deinen Events IDs zu geben, da Tag/Monat/Jahr als Identifizierung spätestens dann scheitert wenn es an einem Tag zwei Events gibt
        Danke für deine Antwort!
        Das mit den Event ids ist eine gute Idee!
        Die Wochenschleife zu verändern habe ich schon versucht, aber immer nix oder Errors bekommen. Wie könnte die Schleife in deinen Augen aussehen?

        Kommentar


        • #5
          PHP-Code:
          $liste = Array();
          $tage 30;

          $item mysqli_fetch_assoc($result);
          //$item["datum"], $item["ende"], $item["event_title"]
          for ($i=0;$i<$tage;++$i)
          {
            
          $d getdate(time()+$i*86400);
            
          $d $d["mday"].$d["mon"].$d["year"];//Oder anders

            
          if ($item){
            while (
          $item["datum"]==$d)
            {
          $liste[] = $item;
            if (!
          $item mysqli_fetch_assoc($result)) break;}}

            echo 
          "<td>",$d,":";
            foreach (
          $liste as $l) echo " ",$l["event_title"];
            echo 
          "</td>\n";

            if (
          $liste){
            
          reset($liste);
            
          $help = &$liste[key($liste)];
            while (
          $help["ende"]==$d)
            {
          array_shift($liste); $help = &$liste[key($liste)];}}

          Kommentar


          • #6
            Vielen lieben Dank für deine Hilfe!

            Leider bekomme ich diese nicht eingebaut! Scheint als müsste ich noch viel lernen! ich dachte echt, ich wäre auf einem guten Weg!

            Danke trotzdem!

            Gruß

            Kommentar


            • #7
              Nicht jeder Tag hat 86400 Sekunden.

              Hier sollte man lieber gleich die Klassen nutzen die PHP bereit stellt:
              http://php.net/manual/de/class.datetime.php
              http://php.net/manual/de/class.dateinterval.php

              Übersicht über Datums und Zeitfunktionen:
              http://php.net/manual/de/book.datetime.php
              Vieles kann, wenig muss.

              Kommentar

              Lädt...
              X