Events aus Datenbank auslesen

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Events aus Datenbank auslesen

Beitrag von Helmut »

Hallo,

ich möchte aus einer Tabelle für einen Veranstaltungskalender gerne die Events der der nächsten x Tage auslesen. Das Datum ist in dem Format (12- 5-2010) in "event_day" eingetragen.

Code: Alles auswählen

$g_event = array();

$sql = 'SELECT event_id, etype_id, event_subject, event_day, 
            YEAR(CURRENT_DATE()) - YEAR(event_day) 
            event,
            DATEDIFF(event_day + INTERVAL 
            (YEAR(CURRENT_DATE) - YEAR(event_day) +
            IF(DATE_FORMAT(CURRENT_DATE, "%m%d") > 
            DATE_FORMAT(event_day, "%m%d"), 1, 0))
            YEAR, CURRENT_DATE) AS all_events
        FROM ' . CALENDAR_EVENTS_TABLE . "
        HAVING
            all_events <= 6 OR
            all_events >= 360
        ORDER BY all_events";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{    
        $g_event[] .= $row['all_events'];        
}

$template->assign_vars(array(
    'S_TEST_7'         =>  implode(', ', $g_event),
));
 
Irgendwie komme ich nicht weiter mit meiner Abfrage, könnt ihr mir da weiter helfen?


Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Events aus Datenbank auslesen

Beitrag von Pyramide »

Helmut hat geschrieben:Das Datum ist in dem Format (12- 5-2010) in "event_day" eingetragen
Da du ja mit den MySQL Datumsfunktionen darauf arbeitest, ist es wohl eher als DATE-Datentyp gespeichert.

Wenn ich den komplexen Befehl richtig lese, sollen alle Events sich jedes Jahr wiederholen? Wenn ja, würde ich mir an deiner Stelle einfach mal den Code der Geburtstagsfunktion von phpBB oder entsprechenden Mods borgen. Wenn das nicht bei jedem Event der Fall ist, würde ich die Datenstruktur an deiner Stelle in eine Beschreibungs- und eine Datumstabelle aufteilen. In der Beschreibungstabelle steht dann z.B. "Sylvester - 31.12. - jährlich wiederholen" und daraus würde dann ein regelmäßiger Cronjob in eine zweite Tabelle z.B. den 31.12.2009 und den 31.12.2010 eintragen. Dann kannst du deine Abfrage hinterher auf ein simples "WHERE event_date BETWEEN curdate() AND (curdate() + INTERVAL 5 DAY)" reduzieren.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Re: Events aus Datenbank auslesen

Beitrag von Helmut »

Hallo Pyramide,

ich habe mir die Funktion für die Geburtstage mal angeschaut, im Prinzip würde das auch gehen. Das Problem liegt aber in der Formatierung des Datums, denn curdate() erwartet es in 2009- 5-12, also genau anders herum als es in der Spalte vom Kalender Mod bzw. in "user_birthday" eingetragen ist. Die Tabelle kann ich nicht umbauen, da diese zu einem Kalender Mod gehört und schon so fertig ist.

Ich brauche also jetzt eine Lösung wo ich bei der Abfrage das Datumsformat so umwandle damit es von curdate() verwendet werden kann?

Code: Alles auswählen

$event_list = '';

$now = getdate(time() + $user->timezone + $user->dst - date('Z'));
$sql = 'SELECT event_id, etype_id, event_subject, event_day
    FROM ' . CALENDAR_EVENTS_TABLE . "
    
    WHERE event_day BETWEEN curdate() AND (curdate() + INTERVAL 5 DAY)
    LIKE '" . $db->sql_escape(sprintf('%2d-%2d-%4d', $now['mday'], $now['mon'], $now['year'])) . "%'";
    
$result = $db->sql_query($sql);

while ($row = $db->sql_fetchrow($result))
{
    $event_list .= (($event_list != '') ? ', ' : '') . ($row['event_subject'] . $row['event_day']);
}
$db->sql_freeresult($result);

$template->assign_vars(array(
    'S_TEST_7'         =>  $event_list,
));
 

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Unimatrix_0
Mitglied
Beiträge: 392
Registriert: 03.11.2007 10:50
Kontaktdaten:

Re: Events aus Datenbank auslesen

Beitrag von Unimatrix_0 »

Helmut hat geschrieben: ...
Ich brauche also jetzt eine Lösung wo ich bei der Abfrage das Datumsformat so umwandle damit es von curdate() verwendet werden kann?
...
Gruß Helmut
Ich klau dann mal von anderer Stelle:
Dr.Death hat geschrieben:... die einfachste Lösung wäre es, das Datum komplett auszulesen ( Format TT.MM.JJJJ ),
dann per explode() an den Punkten zu zerstückeln und Rückwärts wieder zusammen zu setzen.
...
http://www.phpbb.de/community/viewtopic ... 4#p1152887

Sollte damit auch für dich machbar sein das Datum brauchbar umzuwandeln, hoffe ich :)

Lg Un1
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Events aus Datenbank auslesen

Beitrag von Pyramide »

Tja, nur hilft das leider weder hier noch in dem anderen Beitrag...denn die PHP-Funktion explode() kann man weder bei ORDER BY noch bei WHERE in einer SQL-Abfrage verwenden.

Sinnvollerweise sollte man die Datenbank so designen, dass alle Anforderungen ohne unnötige Umwege damit abbildbar sind. Aber da sich die Anforderungen und Rahmenbedingungen in diesem Thema nach jedem Beitrag zu ändern scheinen, wird das wohl schwer werden.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Re: Events aus Datenbank auslesen

Beitrag von Helmut »

Hallo Pyramide,

die Anforderungen haben sich keineswegs geändert, ich brauche immer noch die gleiche Lösung.

Ich habe eine Tabelle, in dem Fall vom Kalender Mod bei dem die Events in diesem Datumsformat (12- 5-2010) abgelegt sind und ich möchte aus der Tabelle alle Events haben die Heute und in den folgenden x Tagen anstehen, auch Monats- und Jahres übergreifend.

Ich habe deine Anregung mit curdate() aufgegriffen aber dann festgestellt, dass da das Datumsformat eben genau anders herum, also 2009- 5-12 gebraucht wird. Daher meine zweite Frage wie ich innerhalb der SQL Abfrage das Datum in das passende Format bekomme.

Alternativ würde mir auch eine andere Lösung zusagen wenn eben nur die entsprechenden Datensätze ausgelesen werden.

Das Format des Datums kann ich in der Tabelle nicht ändern da dann der Mod nicht mehr funktionieren würde. Das Design der Datenbank bzw. des Mods stammt nicht von mir, ich muss daher mit dem klar kommen was da ist.


[EDIT]
Das Problem hat sich gelöst, der Kalender Mod hatte bereits eine solche Funktion eingebaut, diese wurde aber bis jetzt nicht verwendet und ist auch nicht näher Dokumentiert.

Trotzdem würde ich gerne noch die Lösung haben wie ich in einer SQL Abfrage das Datum so umändere, dass es für z.B. curdate() passt.

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“