Zur Navigation

Datum aus mysql aus Tagesliste ausschließen - Dropdown Liste

1 webuser

Hallo,
in einer mysql Datenbank stehen Termine
"Von" und "Bis" im Date Format.

In einem Option Dropdown Liste sollen Datumsangaben von HEUTE +365 Tage stehen.
Aber alle ohne die Daten zwischen dem Zeitraum "VON" und "BIS" .

zb.
von#bis
07.03.2014 # 11.03.2014
######################

angenommen wir haben heute den 04.03.2014

04.03.2014
05.03.2014
06.03.2014
07.03.2014
11.03.2014
12.03.2014
13.03.2014
....
bis
03.03.2015

###################
Gruß
Webuser

04.03.2014 13:16

2 Jörg Kruse

Analog zu diesem Thread würe ich in etwa so vorgehen (ungetestet):

Query Statements:
WHERE bis > CURDATE()
ORDER BY bis

Schleife zur Erzeugung eines Arrays mit den freien Tagen:
$free_days = array();
$next_start = $today = new DateTime('now');
$last_day = $today->add(new DateInterval('P1Y'));
while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['von']);
    $next_start = new DateTime($row(['bis']));
    if ($end < $start) {
        continue;
    }   
    $day = $start;
    while ($day < $end) {
        $free_days[] = $day->format('d.m.Y');
        if ($day >= $last_day) {
            break 2;
        }
        $day->add(new DateInterval('P1D'));
    }   
}

... und danach $free_days wie gewünscht weiterverarbeiten

05.03.2014 10:15

3 webuser

Hallo Jörg,
danke.

Ich habe am Ende
    foreach ($free_days as $interval) {
  echo $interval['$day'];
  echo "<br>";

}
dran gehängt.
Als Liste kommen viele einstellige Zahlen bei raus.
2
2
2
2
2
2
2
3
3
.... uns soweiter.
Gruß
Webuser

05.03.2014 18:42

4 Jörg Kruse

$free_days ist ein eindimensionales Array, welches nur die Datumsangaben enthält:

foreach ($free_days as $free_day) {
    echo $free_day . "<br>";
}

Wenn man Aufbau und Inhalt eines Arrays nich kennt, kann man sich diesen testhalber mit print_r() anzeigen lassen:

echo '<pre>';
print_r($free_days);
echo '</pre>';

05.03.2014 18:50 | geändert: 05.03.2014 18:51

5 webuser

Hallo Jörg,
danke für den Hinweis.
Jetzt läuft es auch.
ABER:

Die Liste startet nach dem ERSTEN Intervall.
Sie muss ab heute beginnen.
Wenn z..B. vom 16.3. bis 23.3. belegt ist, startet Sie mit dem 23..
Sie muss aber dem dem Zeitraum heute beginnen.
(heute bis 15. und dann wie in dem Script)
Gruß
Webuser

05.03.2014 19:38

6 Jörg Kruse

$next_start = $today = new DateTime('now');
$last_day = $today->add(new DateInterval('P1Y'));

Hier liegt wohl der Fehler, dass auch $today selbst verändert wird, und somit zum 06.03.2015 wird.

Probier mal stattdessen so:

$last_day = $next_start = $today = new DateTime('now');
$last_day->add(new DateInterval('P1Y'));

06.03.2014 09:21

7 webuser

Hallo, Jörg,
es sieht gleich aus:
Die Liste startet mit 23.März.
(und nicht mit heute)

Gruß
Webuser
-----------------------------------
Array
(
[0] => 23.03.2014
[1] => 24.03.2014
[2] => 25.03.2014
[3] => 26.03.2014
[4] => 27.03.2014
[5] => 28.03.2014
......
usw.

06.03.2014 22:53

8 Jörg Kruse

Ok, man muss für $last_day wohl ein eigenes DateTime Objekt bilden, damit $today nicht mit verändert wird.

Dritter Versuch:

$next_start = $today = new DateTime('now');
$last_day = new DateTime('now');
$last_day->add(new DateInterval('P1Y'));

07.03.2014 14:23 | geändert: 07.03.2014 14:24

9 webuser

Hallo Jörg,
prima, jetzt fängt die Liste richtig an. ABER:
hört vor dem letzten "BIS" Datum auf.
DateInterval('P1Y')
reagiert nicht.

Gruß
Webuser


07.03.2014 18:25 | geändert: 07.03.2014 18:26

10 Jörg Kruse

Zitat von webuser
DateInterval('P1Y')
reagiert nicht.

Zum Verständnis - diese Zeile:

$last_day->add(new DateInterval('P1Y'));

... addiert ein Jahr zu $last_day hinzu und das "tut" es auch. Du kannst dir die Inhalte der Variablen wie gesagt mit print_r() ausgeben lassen

Gebraucht wird die Variable weiter unten, um spätestens nach einem Jahr abzubrechen:

        if ($day >= $last_day) {
            break 2;
        }

Auch das funktioniert. Das Problem liegt in diesem Fall in dem "spätestens". Die äußere while Schleife endet ja bereits nach dem letzten Datensatz und dieser liegt bei dir wohl noch innerhalb des folgenden Jahres

Die Tage nach dem Ende des letzten Datensatz könntest du in einer gesonderten Schleife (nach Abschluss der äußeren while Schleife) hinzufügen:

if ($day < $last_day) {
    while ($day < $last_day) {
        $free_days[] = $day->format('d.m.Y');
        $day->add(new DateInterval('P1D'));
    }   
}

08.03.2014 09:27 | geändert: 08.03.2014 09:32

1 Forenmitglied fand diesen Beitrag gut