Kombinierte Datenbankabfrage für verschiedene TNG-Events

Ausgangssituation

Ich war schon seit Tagen nicht richtig zufrieden mit der Darstellung der verschiedenen Ereignisse aus TheNextGeneration auf der Startseite unserer Homepage.
Bisher verwendete ich ein an meine Bedürfnisse angepasstes Skript von Timo Kracke, wobei dessen Version wiederum auf Code beruht, den Roger Moffat auf seiner Homepage zur Verfügung stellt. Der entscheidende Trick bei Timo Krackes Skript liegt darin, dass er sämtliche Einzelskripte zu einer großen PHP-Datei zusammen fügt, welche sich um die Ausgabe der unterschiedlichen Informationen innerhalb von einzelnen Abschnitten kümmert.

Ich habe mich für ein Design mit drei Spalten entschieden. Bei meinen ersten Anpassungen der linken Spalte gab es drei <div>-Abschnitte, die jeweils eine einzelne Datenbankabfrage durchführten für die folgenden drei Listen:

  • Liste der Geburtstage
  • Liste der Todestage
  • Liste der Hochzeitstagen

Alles in allem war das Skript insbesondere für einen Programmieranfänger unübersichtlich, da es zusammen kopiert war aus diversen Quellen und manche Code-Passagen quick&dirty auskommentiert waren und so weiter. Als noch viel schlimmer empfand ich jedoch die Darstellung dieser drei getrennten Abschnitte. Gerade bei kleinen Datenbanken bestünde so das Risiko, dass man immer wieder leere Abschnitte ausgibt.

Der Wunsch nach einer kombinierten Ausgabe

Ich stellte mir nun vor, dass eine ereignisübergreifende, chronologisch sortierte Ausgabe besser aussehen würde. Nach der Einführung der genealogischen Zeichen wären die einzelnen Zeilen nun eindeutig unterscheidbar, so dass die Trennung in Abschnitte nicht benötigt würde. Gleichzeitig würde so die Ausgabe kompakter werden.

Es gab nur noch eine Hürde:  meine kaum vorhandenen Programmierfähigkeiten. Bezüglich PHP und SQL würde ich so Neuland betreten. Bisher beschränkten sich meine Basteleien auf das Anpassen einzelner Zeilen oder das Kopieren von kompletten <div>-Abschnitten. Ich nahm die Herausforderung an und bin nun nach etlichen Stunden programmieren zufrieden mit dem Ergebnis.

Das Ergebnis

Das Bild unten zeigt den direkten Vergleich zwischen den drei unabhängigen Abfragen und der neuen, kombinierten Abfrage. Die neue Ausgabe ist erheblich kompakter. Wie man sieht sind die genealogischen Symbole  auch schon eingebaut:

Alte und neue Datenbankabfrage im Vergleich
Alte Datenbankabfrage (links)  und die neue, kombinierte Datenbankabfrage (rechts) im direkten Vergleich

Das Skript

Das vollständige Skript sprengt den Rahmen dieses Artikels. Daher folgt hier nur eine knappe Beschreibung des Ansatzes. Außerdem biete ich den relevanten Abschnitt zum Download an.

Ein großer Teil der Arbeit wird mit der SQL-Abfrage gemacht. Hier lasse ich SQL zum Beispiel bereits den kompletten Ausgabe-String des Hyperlinks zusammen setzen mittels CONCAT(). Damit bleibt der Ausgabe-Teil in PHP übersichtlich. Das SQL-Statement sieht nun so aus:

SELECT "*" as eventtype, gedcom, personID as linkID, CONCAT(firstname,' ',lastname) as hrefdisplay, birthdatetr as datedisplay 
   FROM tng_people 
   WHERE DATE_FORMAT(birthdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18') 
         AND living = "0" 

UNION ALL 
SELECT "&#x271d;" as eventtype, gedcom, personID as linkID, CONCAT(firstname,' ',lastname) as hrefdisplay, deathdatetr as datedisplay 
   FROM tng_people 
   WHERE DATE_FORMAT(deathdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18') 
           AND living = "0"

UNION ALL 
SELECT "~" as eventtype, gedcom, personID as linkID, CONCAT(firstname,' ',lastname) as hrefdisplay, baptdatetr as datedisplay 
   FROM tng_people 
   WHERE DATE_FORMAT(baptdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18')
         AND living = "0"

UNION ALL
SELECT "oo" as eventtype, gedcom, familyID as linkID, CONCAT( (SELECT CONCAT(tng_people.firstname,' ',tng_people.lastname) as husbandname FROM tng_people WHERE tng_people.personID = tng_families.husband) ,' oo ', (SELECT CONCAT(tng_people.firstname,' ',tng_people.lastname) as wifename FROM tng_people WHERE tng_people.personID = tng_families.wife)) as hrefdisplay, marrdatetr as datedisplay 
   FROM tng_families 
   WHERE DATE_FORMAT(marrdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18') 
         AND living = "0"

ORDER BY DATE_FORMAT(datedisplay, '%m-%d'), DATE_FORMAT(datedisplay, '%y')

Das Skript errechnet das Datum der Wochentage der laufenden Kalenderwoche und erzeugt daraus die Vergleichsbedingung für die Abfrage.  Bei der Verwendung von UNION ALL ist zu beachten, dass die Spaltenanzahl für die verschiedenen SELECT-Abschnitte identisch sein muss.

Durch diese Vorbereitung wird die Ausgabe danach sehr vereinfacht. Die verbliebene IF-Abfrage wird aber noch benötigt, da der Hyperlink für Familien und Einzelpersonen sich unterscheidet.

if( $rowCountnew > 0 ) { 
    while ($row = mysql_fetch_array($resultnew) ) {
        switch($row['eventtype']) {
        case "&#x26AD;":
         
                echo "<span class=\"tnglink\"><a href=\"/genealogie/familygroup.php?familyID=" . $row['linkID'] . "&amp;tree=" . $row['gedcom'] . "\">" . $row['hrefdisplay'] . "</a>   <span class=\"tngdatebracket\">( <span class=\"tngsymbol\">" . $row['eventtype'] . "</span> ". displaydate ( $row['datedisplay']) . ")</span></span>" . "<br />\n";
                 break; 
        default:
                echo "<span class=\"tnglink\"><a href=\"/genealogie/getperson.php?personID="   . $row['linkID'] . "&amp;tree=" . $row['gedcom'] . "\">" . $row['hrefdisplay'] . "</a>   <span class=\"tngdatebracket\">( <span class=\"tngsymbol\">" . $row['eventtype'] . "</span> ". displaydate ( $row['datedisplay']) . ")</span></span>" . "<br />\n";
                break;
        }
    }
}

Download:

[wpdm_file id=2]

 

1 Gedanke zu “Kombinierte Datenbankabfrage für verschiedene TNG-Events”

  1. Tolles Tool, für Version 10.1 ist mysql _ durch tng_ zu ersetzen, dann funktioniert es wieder. Nur die Datumsausgabe gefällt mir nicht, hätte lieber z.B. 15. März 2015. Gruß Micha

Schreibe einen Kommentar

Ich akzeptiere