Rolf B: Probleme mit Zentrierung von Tabellen

Beitrag lesen

Hallo Chuaat,

ich würde auch gern mal über die abfrage.php reden. Die sieht sehr merkwürdig aus.

  • Wo kommt $timestamp her und was steht drin?
  • Wieso formatierst Du Datumswerte als Y.d.m, das ist zum Sortieren und auch für deutsches Datumsverständnis unpassend. Entweder d.m.Y für die Anzeige, oder Y-m-d zum Sortieren.
  • In der Datenbank sollte ein Datum kein String sein, bei Dir scheint es aber so zu sein. MYSQL hat eigene Datentypen für zeitliche Werte, in deinem Fall wäre wohl DATE richtig (es sei denn, du brauchst für die, die ihre HA in der Pause vor der Stunde machen, auch Uhrzeiten im „zu erledigen bis“). DATE Spalten werden trotzdem als String nach PHP transportiert (vermutlich aus irgendwelchen historischen Gründen), im Format Y-m-d, d.h. die solltest Du dann nicht mit strtotime in einen time_t verwandeln, sondern mit new DateTime($row->Bis) in ein DateTime Objekt. Davon kannst Du mit der add Methode einen Tag abziehen, das funktioniert dann auch korrekt an Tagen mit Uhrzeitumstellung.
$row = mysqli_fetch_object($db, mysqli_fetch_object($ergebnis);
$bis = new DateTime($row->Bis);

$bis->sub(new DateInterval("P1D")); // 1 Tag abziehen

Die Strings im Konstruktor für DateInterval sind etwas kryptisch, sie beginnen immer mit P (Periode), dann kommen Zahlen und Buchstaben. Näheres steht hier.

  • Du liest die aktuellen Aufgaben ein, aber es ist nicht so gut, wenn Du 'Bio' hart codiert in der Abfrage hat. Besser ist es, wenn Du deine Abfrage in eine Funktion packst und diese Funktion ganz zu Anfang von bio.php mit require_once einbindest. Der Funktion kannst Du dann Parameter geben. Die Ergebnisse sammelst Du in einem Array und gibst es zurück - man muss DB-Zugriffe, Fachlogik und HTML Ausgabe möglichst gut trennen, das schafft Wiederverwendbarkeit und macht den Code überschaubarer. Sicherlich gibt es noch mehr Code-Teile, die man auf diese Weise in Funktionen kapseln kann, daraus machst Du ein functions.php und lädst es zu Beginn.
<?php
function LeseHausaufgaben($fach) {
   $abfrage = "SELECT * FROM Hausaufgaben WHERE Fach = '$fach' ORDER BY Bis ";
   $ergebnis = mysqli_query($db, $abfrage);
   if ($ergebnis === FALSE) {
      // Hier noch hinzufügen: Fehler und SQL Query ins Log schreiben.
      // NICHT ins HTML ausgeben
      die ("SQL Query gescheitert!");
   }
   $aufgaben = ARRAY();
   while ($row = mysqli_fetch_object($ergebnis)) {
      $aufgaben[] = $row;
   }
   return $aufgaben;
}

Das verwendest Du dann - verkürzt gezeigt - so:

$aufgaben = LeseHausaufgaben("Bio");
if (count($aufgaben) == 0) {
   echo "Heute nichts auf";
}
else {
   foreach ($aufgaben as $aufgabe) {
      ... ausgeben
   }
}

Deine Löschlogik ist mir nicht klar. Da ist ein $timestamp Wert mit unbekannter Herkunft, und du löschst dann mit einem LIKE. Das ist sehr merkwürdig. Zum einen ist LIKE für einen Mustervergleich gedacht und du hast überhaupt kein Muster, zum anderen - was willst Du tun? Alles löschen was bis gestern oder noch früher zu erledigen war? Dafür kannst Du SQL Bordmittel verwenden. Es gibt die Funktion CURDATE, die liefert das aktuelle Datum, und es gibt in SQL Datumsarithmetik:

DELETE 
FROM Hausaufgaben 
WHERE Fach = 'Bio' 
  AND Bis < DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Würde alles löschen, was bis vorgestern fällig war (wegen des < Vergleichs). Für Löschen "bis gestern" brauchst Du gar nicht rechnen.

Das funktioniert natürlich nur gut, wenn Bis eine Datumsspalte ist.

Rolf

--
sumpsi - posui - obstruxi