Zur Navigation

nächste freie Termine finden mysql [2]

... 1 Jahr und 1 Monat später ...

11 webuser

Hallo,
ich hatte das Script am laufen. Aber es läuft nicht mehr. Kann es ev. mit einer
neuen PHP Version zu tun haben?
$result = mysql_query("
    SELECT *
    FROM belegung
    WHERE Abreise > CURDATE()
    ORDER BY Abreise
");

 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['Anreise']);
     $next_start = new DateTime($row['Abreise']);
    if ($end < $start) {
        continue;
    }
    $interval = $end->diff($start);
    if ($interval->format('%a') <= 3) {
        continue;
    }
    $free_intervals[] = array(
        'start' => $start->format('d.m.Y'),
        'end' => $end->format('d.m.Y')
    );

    if (count($free_intervals) >=6) {
        break;
    }

}
  echo "<div style='font-family:Verdana;background-color:#F7FC10;padding-left:10px;width:330px;font-size:1.1em;'>Termine:</div>";

    foreach ($free_intervals as $interval) {
    echo "<div style='font-family:Verdana;background-color:#F7FC90;padding-left:10px;width:330px;font-size:1.1em;'>Frei von ".$interval['start']." bis ".$interval['end']."</div>";

}


mysql_close($conn);
?>
Gruß
Webuser

05.04.2015 23:00 | geändert von Jörg: 06.04.2015 13:17

12 Jörg Kruse

Aber es läuft nicht mehr.

Was heißt das genau? gibt es eine Fehlermeldung?

Gegebenenfalls vorher das PHP Error-Reporting einschalten:

ini_set('display_errors', 1); 
error_reporting(E_ALL);

06.04.2015 09:59

13 webuser

Hallo,
es wird keine Fehler gezeigt. Die Anzeige ist leer.
(Nur der Kopf der Liste (Termine im.......) erscheint.

Gruß
webuser

06.04.2015 11:42

14 Jörg Kruse

Du erhältst aber Ergebnisse, wenn du die Abfrage in phpMyAdmin (unter dem Tab "SQL") eingibst (?):

    SELECT *
    FROM belegung
    WHERE Abreise > CURDATE()
    ORDER BY Abreise

06.04.2015 12:26

15 webuser

Hallo,
mit
if (!$result)
                {
                die("Error: Data not found..");
                }


 while ($row = mysql_fetch_array($result)) {
   echo $row['Anreise'];
   echo"<br>";


}
wird eine Liste mit Terminen angezeigt.
2015-04-11
2015-04-18
2015-05-02
....

Gruß
Webuser

06.04.2015 13:01

16 Jörg Kruse

Die Datensätzen müssen ja mehrere Bedingungen erfüllen, andernfalls werden sie übersprungen:

    if ($end < $start) {
        continue;
    }
    $interval = $end->diff($start);
    if ($interval->format('%a') <= 3) {
        continue;
    }

Du kannst testweise jeweils ein continue auskommentieren, dann siehst du, ob an der Stelle die Datensätze ausgefiltert werden.

06.04.2015 13:26

17 Jörg Kruse

Wegen deiner Email:

Meine Antwort konnte nicht zugestellt werden, da in deinem Email-Account ein Quota überschritten wurde.

Ich habe den betreffenden Text bearbeitet.

06.04.2015 13:30

18 webuser

Hallo,
der Fehler scheint zu sein:
Das Programm geht bis zum letzten Abreisedatum und sucht dann die
Lücken. Wo kann man als "bis" Datum
Heute + 360 Tage einstellen?
Wenn die letzte Abreise 1.7. ist dann ist der Zeitraum
1.7.2015 bis 6.4.2016 frei.

Gruß
Webuser

06.04.2015 14:10

19 Jörg Kruse

Vielleicht so in der Art:

$free_intervals = array();                                                         
$next_start = new DateTime('now');                                                 
while ($row = mysql_fetch_array($result) || $next_start) {                         
    $start = $next_start;                                                          
    if ($row) {                                                                    
        $end = new DateTime($row['Anreise']);                                      
        $next_start = new DateTime($row['Abreise']);                               
    } else {
        $end = new DateTime('now');
        $end->add(new DateInterval('P360D'));
        $next_start = false;
    }                                                                              
    if ($end < $start) {                                                           
        continue;                                                                  
    }                                                                              
    $interval = $end->diff($start);                                                
    if ($interval->format('%a') <= 3) {                                            
        continue;                                                                  
    }                                                                              
    $free_intervals[] = array(                                                     
        'start' => $start->format('d.m.Y'),                                        
        'end' => $end->format('d.m.Y')                                             
    );                                                                             
    if (count($free_intervals) >=6) {                                              
        break;                                                                     
    }                                                                              
} 

06.04.2015 17:18

20 webuser

Hallo,
es scheint noch etwas zu haken:
Das Programm rechnet und rechnet....
und bricht dann ab mit
Maximum execution time of 120 seconds exceeded in ....

Der Abbruch ist in Zeile 47
$interval = $end->diff($start);


Gruß
Webuser

06.04.2015 19:09 | geändert: 06.04.2015 19:10