Zur Navigation

nächste freie Termine finden mysql

1 webuser

Hallo,
in einer mysql Datenbank stehen Termine im DATE Format.
Ich habe 2 Datumsfelder "von" und "bis" in dem Formular zum abfragen.
Die Abfrage soll die nächsten 2 freien Zeiträume mehr als 3 Tage zeigen.
z.B.
von#bis
12.05.2014#16.05.2014
20.05.2014#28.05.2014
06.06.2014#16.06.2014

Angenommen wir haben heute den
03.03.2014
Dann soll die Abfrage zeigen:

Ab sofort frei bis 12.05.2014 und der nächste freie Termin ist vom 16.05. bis 20.05.


Angenommen wir haben den 10.05.2014

Dann
Der nächste freie Zeitraum ist vom 16.05. bis 20.05 und vom 28.05. bis 06.06.
Gruss
Webuser

03.03.2014 06:10

2 webuser

Hallo,
das mit den beiden Formularfeldern

Ich habe 2 Datumsfelder "von" und "bis" in dem Formular zum abfragen.

wie anfangs geschrieben ist nicht nötig.
-Denkfehler-.
Jedes Mal beim Aufrufen der php Seite solle die Abfrage die nächsten Termine suchen.

Gruß
Webuser

03.03.2014 08:01

3 Jörg

Ein Ansatz wäre vielleicht, alle neueren Termine geordnet aus der Datenbank aus holen:

WHERE bis > CURDATE()
ORDER BY bis

... und in einer Schleife die Intervalle zu ermitteln (ungetestet):

$free_intervals = array();
$next_start = new DateTime('now');
while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['von']);
    $next_start = new DateTime($row(['bis']));
    if ($end < $start) {
        continue;
    }   
    $interval = $end->diff($start);
    if ($interval->format('%a') <= 3) {
        continue;
    }   
    $free_intervals[] = array(
        'start' => $start->format('%D.%M'), 
        'end' => $end->format('%D.%M')
    );
    if (count($free_intervals) >= 2) {
        break;
    }   
}

Das resultierende Array $free_intervals kannst du dann in einer weiteren Schleife auswerten

03.03.2014 11:57 | geändert: 03.03.2014 11:57

4 webuser

Hallo Jörg,
es hakt noch:

Gruss webuser
(PS: mit Arrays bin ich nicht so gut vertraut)

<?php
require("db.php");


$result = mysql_query("SELECT * FROM termine WHERE bis > CURDATE() ORDER BY bis");
   $test = mysql_fetch_array($result);
if (!$result)
                {
                die("Error: Data not found..");
                }
                            $free_intervals = array();
$next_start = new DateTime('now');
while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['von']);


     //nächste Zeile diese Meldung
    //Parse error: syntax error, unexpected '[', expecting ')' in /var/www/xxxxxxx
     $next_start = new DateTime($row(['bis']));
    if ($end < $start) {
        continue;
    }
    $interval = $end->diff($start);
    if ($interval->format('%a') <= 3) {
        continue;
    }
    $free_intervals[] = array(
        'start' => $start->format('%D.%M'),
        'end' => $end->format('%D.%M')
    );
    if (count($free_intervals) >= 2) {
        break;
    }
     Echo $free_intervals['start']."|".Echo $free_intervals['end'];
    }

}
mysql_close($conn);
?>

03.03.2014 19:17

5 Jörg

Diese Zeile ist wohl überflüssig:

   $test = mysql_fetch_array($result);

     //nächste Zeile diese Meldung
    //Parse error: syntax error, unexpected '[', expecting ')' in /var/www/xxxxxxx
     $next_start = new DateTime($row(['bis']));

Ja, da hatte es ein paar Klammern zuviel - die müssen weg:

     $next_start = new DateTime($row['bis']);

    if (count($free_intervals) >= 2) {
        break;
    }
     Echo $free_intervals['start']."|".Echo $free_intervals['end'];
    }

Eine schließende Klammer ist wohl zuviel und das zweite echo ist fehl am Platz, wenn du die Strings mit '.' verbindest

Die Ausgabe der Daten in $free_intervals wird so aber eh nicht funktionieren, weil $free_intervals ein mehrdimensionales Array ist. Außerdem fehlt nach dem break das letzte Array Element

Du kannst die Daten nach der while Schleife in einer foreach Schleife ausgeben:

foreach ($free_intervals as $interval) {
    echo $interval['start']."|".$interval['end'];
}

03.03.2014 20:36 | geändert: 03.03.2014 20:37

6 webuser

Hallo Jörg,
danke. Aber als Ergebnis kommt:

%Mon.%Mar|%Sun.%Mar

bei raus.

Gruss
Webuser

Hier noch mal der Code:
$free_intervals = array();
$next_start = new DateTime('now');
while ($row = mysql_fetch_array($result)) {
    $start = $next_start;
    $end = new DateTime($row['von']);
     $next_start = new DateTime($row['bis']);
    if ($end < $start) {
        continue;
    }
    $interval = $end->diff($start);
    if ($interval->format('%a') <= 3) {
        continue;
    }
    $free_intervals[] = array(
        'start' => $start->format('%D.%M'),
        'end' => $end->format('%D.%M')
    );
    if (count($free_intervals) >= 2) {
        break;
    }
foreach ($free_intervals as $interval) {
    echo $interval['start']."|".$interval['end'];
}
}

mysql_close($conn);
?>

03.03.2014 21:08

7 Jörg

Ja, ich seh grad, dass DateInterval::format und DateTime::format unterschiedliche Parameter-Strings verwenden - letzteres in Übereinstimmung mit date()

Entsprechend sollten bei der Erzeugung der Datumsangaben %d und %m verwendet werden:

$datum_xy->format('%d.%m')

Edit:

die foreach Schleife sollte du außerhalb der while Schleife stehen!

03.03.2014 21:37 | geändert: 03.03.2014 21:41

8 webuser

Hallo Jörg,
danke.

diese ist ok:
   'start' => $start->format('d.m'),
        'end' => $end->format('d.m')

fast gelöst:
es wird nur 1 Datumsbereich gezeigt:
 if (count($free_intervals) >= 2) {
        break;
    }
foreach ($free_intervals as $interval) {
    echo $interval['start']." bis ".$interval['end'];
    echo "<br>";

Anzeige:
03.03 bis 16.03


es wird nur durch ändern von >= 2 auf >2 werden
3 Datensätze gezeigt.
Der erste wird wiederholt.
03.03 bis 16.03
03.03 bis 16.03
23.03 bis 12.04


 if (count($free_intervals) > 2) {
        break;
    }
foreach ($free_intervals as $interval) {
    echo $interval['start']." bis ".$interval['end'];
    echo "<br>";

Gruß
Webuser

03.03.2014 22:02

9 Jörg

">= 2" ist schon richtig. Die doppelten bzw. unvollständigen Ergebnisse erhältst du, weil die foreach Schleife innerhalb der while Schleife abläuft - sie muss außerhalb stehen!

03.03.2014 22:08

1 Forenmitglied fand diesen Beitrag gut

10 webuser

Danke Jörg,
perfekt.
Gruß
Webuser

04.03.2014 06:50