vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Tag 15

Komplexe Techniken: Existierende Websites mithilfe dynamischer Werkzeuge konvertieren

Sicher haben Sie auch schon Websites entwickelt, bevor Sie dieses Buch gekauft haben. Möglicherweise haben Sie bereits Situationen kennen gelernt, wo Sie dynamische Werkzeuge hätten einsetzen können, um die Funktionalität Ihrer Site zu verbessern, ihr ein attraktiveres Aussehen zu erteilen oder ihre kommerzielle Komponente zu unterstützen. Heute betrachten wir mehrere kleine UltraDev-Applikationen, die Sie nutzen können, um bereits existierende Abschnitte Ihrer jetzt »statischen« Sites zu ergänzen oder zu ersetzen. Ich habe versucht, Applikationen auszuwählen, die man nicht auf den ersten Blick als datenbankgestützt erkennen sollte, aber natürlich ist es möglich. Heute geht es um Folgendes:

15.1 Der Umstieg vom Statischen zum Dynamischen

Der schwierigste Part bei der Entwicklung dynamischer Webseiten ist, sich daran zu gewöhnen, Regeln zu brechen, die Sie bisher streng befolgt haben. Statt statische Links auf Ihren Seiten oder statische Objekte zu verwenden, haben Sie plötzlich die Möglichkeit, alle Seiten Ihrer Site jederzeit zu verändern, wenn ein Benutzer sie besucht.

Die komplizierteren Online-Applikationen, wie beispielsweise E-Commerce und durchsuchbare Datenbanken, werden später in dieser Woche detailliert beschrieben, aber Sie werden feststellen, dass viele der interessantesten Websites ganz einfache dynamische Funktionen einsetzen. Wie oft waren Sie beispielsweise auf der Website von Dilbert? (Falls Sie jetzt sagen »Noch nie!«, dann frage ich mich, was Sie mit einem Computerbuch tun.) Viele Leute besuchen die Site täglich. Dasselbe trifft auf Sites wie beispielsweise MSN oder Computer-Sites wie beispielsweise versiontracker.com zu. Ich vermute, dass auch Sie bestimmte Websites mindestens einmal wöchentlich besuchen. Die Frage lautet also: »Warum besuchen Sie diese Sites so häufig?«

Denken Sie doch einmal darüber nach. Die Antwort ist: Sie gehen immer wieder auf die Site zurück, weil sich ihr Inhalt ändert. Auf der Dilbert-Website wird jeden Tag ein neuer Dilbert-Comic veröffentlicht. Bei MSN finden Sie jeden Tag aktuelle Nachrichten. Die Bereitstellung neuen, aktuellen Inhalts ist eine ausgezeichnete Strategie, Ihre Site für Besucher attraktiv zu gestalten.

Was aber tun, wenn Sie Ihre Site nicht täglich aktualisieren wollen? Sie könnten Ihren Besuchern dennoch dynamische Information und Bilder bereitstellen. Viele Sites halten in ihren Datenbanken bereits vorverarbeiteten Inhalt bereit, der zu einer bestimmten Zeit oder zu einem bestimmten Datum angezeigt wird. Für eine Nachrichten-Site ist das nicht möglich (es sei denn, Sie glauben wirklich daran, dass die Medien die Nachrichten erfinden, bevor sie wirklich passieren), aber viele andere Inhaltstypen können erzeugt werden, bevor sie wirklich benötigt werden, wie beispielsweise Bilder, wöchentlich neue Rezepte oder monatliche Newsletters.

Heute werden Sie ein paar kleine Projekte kennen lernen, die Sie auf Ihrer Website nutzen können, um die herkömmlichen statischen Elemente zu ersetzen. Dabei handelt es sich um gebräuchliche Module für Websites, die verwendet werden, um Sites zu ergänzen, die Sie bereits im Web haben. Hier ein kurzer Überblick, um was es gehen wird:

Durch diese Mini-Projekte werden Sie erkennen, was alles möglich ist, und Sie sind bereit für die großen Projekte, die wir im weiteren Verlauf dieser Woche vorstellen werden. Anschließend können Sie Ihre bereits existierenden Sites daraufhin auswerten, ob eines dieser Funktionsmerkmale dafür geeignet ist.

Bevor wir anfangen, will ich kurz darauf eingehen, was Sie in den nächsten Kapiteln dieses Buchs erwartet. Meine Philosophie ist einfach - Learning by Doing. UltraDev ist an sich einfach. Sie kennen bereits alle Funktionen und wissen, wie man über die Paletten Serververhalten und Datenbindungen darauf zugreift. Die HTML- Layoutmöglichkeiten von UltraDev sind etwas komplizierter zu verstehen als die Werkzeuge zur dynamischen Datenbankverbindung. Deshalb ist die letzte Woche dieses Buchs Beispielen aus der Praxis gewidmet, die die Flexibilität und die vielen Möglichkeiten von UltraDev in Kombination mit einem SQL-Server demonstrieren. Alle Beispiele dieser letzten Woche sind mit dem MySQL-Server kompatibel, Sie können sie also ohne weiteren Aufwand jederzeit nachvollziehen.

Diese Kapitel werden in drei Abschnitten präsentiert:

  1. Datenbankentwurf - Der wichtigste Teil jedes Projekts ist der Entwurf des Backends. Bestimmte Beschränkungen der UltraDev-Verhalten können durch eine entsprechende Formulierung der Abfragen kompensiert werden. Selbst wenn Sie bereits Erfahrungen mit Datenbanken mitbringen, werden Sie auf Probleme treffen, wenn Sie hier nicht genau aufpassen.
  2. Site-Entwurf - Vor dem HTML und der Programmierung sollten Sie festlegen, wie die Site aussehen soll. Das dauert normalerweise nicht lang, sollte aber durchaus ernst genommen werden. Sie sollten mit der Codierung erst anfangen, nachdem Sie das gesamte Projekt durchdacht haben. Wenn Sie sich nicht vorab über die Struktur Gedanken machen, werden Sie irgendwann in einer Sackgasse enden.
  3. Implementierung - Jedes Kapitel endet mit der Implementierung des Projekts - dem HTML-Entwurf und dem Einfügen von Serververhaltensweisen usw. Manchmal muss der Quellcode dafür manuell bearbeitet werden. Nachdem die Implementierung abgeschlossen ist, haben Sie eine voll funktionale Website, die auf einem Produktions- Server eingesetzt werden kann. Sie müssen Ihren eigenen Inhalt schaffen, aber das Gerüst steht.

Ich glaube, der hier beschriebene Ansatz ist am besten dafür geeignet, Ihnen ein vollständiges Bild des Projektablaufs zu verschaffen. Sie können natürlich jederzeit etwas überspringen, aber ich empfehle Ihnen, jedes Kapitel zu lesen und nicht zwischen den Abschnitten zu springen, bevor Sie nicht wirklich alles verstanden haben. Manchmal werde ich Ihnen ein paar »Tricks« zeigen, also Dinge, die in UltraDev nicht vorgesehen waren. Merken Sie sich diese Dinge, um Ihre Vorstellungen in Ihrem UltraDev-Projekt verwirklichen zu können.

Fangen wir an!

15.2 Banner-Anzeigen zufällig ausgeben

Sie sind langweilig, aber beliebt. Banner-Anzeigen können für gutes Geld verkauft werden, wenn Ihre Site stark frequentiert ist. Sie haben gesehen, wie man dynamisch eine Bildfolge anzeigt, aber Sie haben noch kein Bild erstellt, das dynamisch ist. Mithilfe einer Tabelle mit mehreren Bildern sind Sie bereits auf dem richtigen Weg, aber sie übernimmt noch nicht den Austausch der Bilder, wenn die Seite wiederholt geladen wird.

Tabellendefinitionen

Der Schlüssel zur Realisierung der abwechselnd angezeigten Bilder ist eine Abfrage, die bei jeder Ausführung ein anderes Bild zurückgibt. Das ist einfacher als Sie glauben, aber bevor Sie diese magische Abfrage definieren können, müssen Sie die Datenbank anlegen, die sie steuert.

In jedem der Projekte setze ich voraus, dass Sie die Verbindung zu der Datenbank bereits eingerichtet haben, bevor ich mit der Übung beginne. Machen Sie das jetzt, falls Sie es noch nicht erledigt haben. Anschließend beginnen wir mit dem SQL.

Um die Auswahl eines Bildes zufällig vorzunehmen, brauchen Sie zunächst mehrere Bilder. Diese Bilder werden in Ihrer Datenbanktabelle abgelegt. Darüber hinaus sind die meisten Banner Links auf andere Sites, deshalb brauchen Sie eine Methode, wie die Applikation einen Hyperlink für das angezeigte Bild setzen kann.

Die Tabellendefinition muss nur diese beiden Felder berücksichtigen - und weil wir voraussetzen, dass Sie unterschiedliche Namen für die einzelnen Banner angeben, verwenden wir den Dateinamen als Primärschlüssel:

create table tblBanner (
image varchar(80) not null,
url varchar(80) not null,
primary key (image)
);

Wie Sie bereits erfahren haben, können wir nicht wirklich Bilder in einer Tabelle ablegen, aber wir können die Dateinamen dort speichern und diese dann in ein <IMG>-Tag einfügen. Durch Einschließen des <IMG>-Tags fügen wir einen Link ein, der aus dem Feld url gespeist wird.

Abbildung 15.1 zeigt das Tabellenlayout für diese einfache Banner-Applikation.

Abbildung 15.1:  Die Banner-Tabelle enthält Bildposition und Link-URL-Information.

Beispieldaten

Ich werde in meinem System zunächst drei Banner verwenden, die ich als Beispiele angelegt habe - wie in Abbildung 15.2 gezeigt.

Abbildung 15.2:  Ich habe ein paar Banner für meine Version des dynamischen Bildprogramms erstellt. Ich hoffe, Sie haben ein bisschen mehr Fantasie.

Für jedes dieser drei Banner habe ich ein Verzeichnis und einen Dateinamen, die angeben, wo auf dem Server es gespeichert ist, sowie eine URL, zu der der Benutzer gelangen soll, wenn er darauf klickt:

Diese URLs existieren natürlich nicht, aber ich besitze den Domänennamen poisontooth. Statt einfach davon auszugehen, dass es sich bei einem beliebigen Beispiel um eine nicht-existente Domäne handelt (was heutzutage nahezu unmöglich ist), habe in vielen der Beispiele einfach meine eigene verwendet. Ich will schließlich nicht, dass die echte Firma »Tscharlie's Tattoos« unzählige E-Mails erhält, nur weil ich ohne es zu wissen ihre Adresse hier bereitstelle.

Geben Sie ein paar Beispieldaten in Ihre Datenbanktabelle ein:

insert into tblBanner values 
=>;('banners/fade.gif','http://fade.poisontooth.com/');
insert into tblBanner values
=>;('banners/buddy.gif','http://buddy.poisontooth.com/');
insert into tblBanner values
=>;('banners/detailing.gif', 'http://detailing.poisontooth.com/');

Die SQL-Abfrage

Es gibt bereits Daten in der Banner-Tabelle, aber das erklärt noch nicht, wie wir ein beliebiges Bild auswählen können. Offensichtlich können wir alle Daten mit einer einfachen SELECT-Abfrage auswählen:

mysql> SELECT * FROM tblBanner;
+-----------------------+-----------------------------------+
| image | url |
+-----------------------+-----------------------------------+
| banners/fade.gif | http://fade.poisontooth.com/ |
| banners/buddy.gif | http://buddy.poisontooth.com/ |
| banners/detailing.gif | http://detailing.poisontooth.com/ |
+-----------------------+-----------------------------------+
3 rows in set (0.04 sec)

Leider wird die Information bei jeder Ausführung dieser Abfrage in derselben Reihenfolge angezeigt. Praktisch wäre es, wenn die Datensätze in unterschiedlicher Reihenfolge zurückgegeben würden. Durch Verwendung der ORDER BY-Klausel für die Suche in Kombination mit der MySQL-Funktion rand() bewirken Sie eine Rückgabe der Datensätze in zufälliger Reihenfolge:

mysql> SELECT * FROM tblBanner ORDER BY RAND();
+-----------------------+-----------------------------------+
| image | url |
+-----------------------+-----------------------------------+
| banners/detailing.gif | http://detailing.poisontooth.com/ |
| banners/buddy.gif | http://buddy.poisontooth.com/ |
| banners/fade.gif | http://fade.poisontooth.com/ |
+-----------------------+-----------------------------------+

Das ist schon sehr viel besser. Es gibt aber noch ein Problem bei dieser Abfrage - es werden alle Datensätze zurückgegeben, nicht nur einer. Weil wir nur an der Anzeige eines einzigen Bildes interessiert sind, sind die restlichen zurückgegebenen Datensätze nicht relevant. Am besten begrenzt man die Anzahl der zurückgegebenen Ergebnisse, indem man am Ende der Abfrage die Anweisung LIMIT einfügt. Mit LIMIT 1 wird die Anzahl der zurückgegebenen Datensätze auf einen einzigen beschränkt:

mysql> SELECT * FROM tblBanner ORDER BY RAND() LIMIT 1;
+-----------------------+-----------------------------------+
| image | url |
+-----------------------+-----------------------------------+
| banners/detailing.gif | http://detailing.poisontooth.com/ |
+-----------------------+-----------------------------------+
1 row in set (0.04 sec)

Das brauchen Sie nicht unbedingt. UltraDev verarbeitet Datensatzgruppen so, dass der einzige Datensatz, auf den Sie unmittelbaren Zugriff haben, der erste in der Datensatzgruppe zurückgegebene ist, es sei denn, Sie weisen das Programm explizit an, alle Datensätze in der Datenbank zu durchlaufen - und das ist genau, was Sie wollen.

So weit das SQL. Jetzt sollten wir den Plan für unsere Site anlegen. Dieses Projekt unterscheidet sich jedoch von den anderen, weil es Bilder bereitstellt, die auf jeder Seite der Site angezeigt werden können. Aus diesem Grund können wir die Planung der Site überspringen, weil es keine solche gibt.

Implementierung

Um die in beliebiger Reihenfolge bereitgestellten Bilder zu implementieren, öffnen Sie ein neues Entwurfsdokument in UltraDev. Sie können dafür gegebenenfalls eine bereits existierende Datei verwenden. Um dem dynamischen Banner Leben einzuhauchen, brauchen wir drei in UltraDev entwickelte Elemente auf der Seite:

  1. Eine Datensatzgruppe, die das anzuzeigende Bild enthält - Diese Datensatzgruppe stellt das Bild bereit, das wir anzeigen wollen. Weil das SQL bereits entwickelt wurde, sollte es kein Problem sein, die Abfrage in UltraDev zu realisieren.
  2. Ein Bild, dessen Quelle mit dem Bildfeld der Datensatzgruppe verbunden ist.
  3. Einen Link um das Bild herum, der auf das URL-Feld gesetzt wird.

Zunächst fügen wir die Datensatzgruppe auf der Seite ein. Weil alle anderen Elemente von der Datensatzgruppe abhängig sind, ist es wenig sinnvoll, an anderer Stelle zu beginnen.

Öffnen Sie die Palette Serververhalten und klicken Sie auf das Plussymbol (+). Wählen Sie aus der Popup-Liste die Option Datensatzgruppe (Abfrage). Weil diese Abfrage die Verwendung spezieller Funktionen bedingt, können Sie den einfachen Abfragemodus nicht für die Konfiguration einer zufälligen Rückgabereihenfolge verwenden. Klicken Sie auf die Schaltfläche Erweitert, um in den erweiterten Modus zu gelangen.

Im erweiterten Abfrage-Definitionsmodus, den Sie in Abbildung 15.3 sehen, können Sie die Abfragen für diese Site manuell definieren. Ich arbeite aufgrund der gesteigerten Flexibilität normalerweise immer im erweiterten Modus. Wenn Sie sich daran gewöhnt haben, manuell Abfrageanweisungen einzugeben, werden Sie sicher genau so vorgehen.

Konfigurieren Sie die erweiterte Abfrage wie zuvor:

  1. Legen Sie die Abfrage rsBanner an.
  2. Wählen Sie die aktuelle Verbindung aus, die Sie für das aktuelle Projekt verwenden.
  3. Geben Sie Ihre Abfrage wie folgt ein: "SELECT * FROM tblBanner ORDER BY RAND() LIMIT 1;".

    Abbildung 15.3:  Wir definieren die Abfrage manuell im erweiterten Modus. Die Verwendung der Funktion Rand ist auf dem Bildschirm für die einfache Abfragekonfiguration nicht erlaubt.

Klicken Sie auf die Schaltfläche Testen, um die Abfrage ein paar Mal auszuprobieren - Sie sollten kein bestimmtes Muster bei der Rückgabe der Datensätze erkennen können. Kein Computer kann wirklich zufällig arbeiten, aber das hier Gezeigte sollte für die meisten Aufgabenstellungen ausreichend sein. Wenn Sie nicht MySQL einsetzen, lesen Sie im Handbuch Ihres Datenbankservers nach, ob es eine entsprechende Zufallsfunktion gibt.

Zufällige Ereignisse

Wenn Sie feststellen, dass ein Datensatz mehrmals hintereinander zurückgegeben wird, bedeutet das nicht unbedingt, dass ein Fehler vorliegt. Es ist zwar unwahrscheinlich, dass sehr viele Wiederholungen auftreten, aber das Auftreten jedes einzelnen Ereignisses ist gleich wahrscheinlich. Wenn Sie also drei Bilder haben, dann besteht bei jeder zufälligen Auswahl die Wahrscheinlichkeit von 1:3, dass wieder dasselbe wie zuvor ausgewählt wird.

Jetzt sollen dem Dokument die Bilder hinzugefügt werden. Öffnen Sie die Objektpalette, und klicken Sie auf das Symbol Bild, oder wählen Sie im Menü Einfügen die Option Bild. Sie werden aufgefordert, die einzufügende Datei anzugeben. Statt eine der erstellten Grafikdateien auszuwählen, klicken Sie auf die Option Dateinamen wählen aus Datenquellen. Der in Abbildung 15.4 gezeigte Bildschirm mit den Bindungen unter dem Eintrag Datensatzgruppe (Abfrage) wird aufgerufen. Dort können Sie auch eines der Felder aus der Tabelle tblBanner zum SRC-Attribut des <IMG>-Tags binden.

Klicken Sie auf den Expansionspfeil neben der Datensatzgruppe rsBanner, um seine Felder anzuzeigen. Wählen Sie das Bildfeld aus und klicken Sie auf OK, um die Bindung zu vervollständigen.

Weil UltraDev im Code nicht mit Bildnamen arbeitet, sehen Sie nur ein Symbol, das das Bild repräsentiert. Sie können jedoch im Menü Ansicht die Option Live-Data aktivieren, um die Datenbank abzufragen und eines der zufällig ausgewählten Bilder anzuzeigen. Klicken Sie oben im Fenster ein paar Mal auf die Schaltfläche Aktualisieren - bei jedem Klick wird ein neues Bild ausgewählt. Beachten Sie, dass die Auswahl zufällig erfolgt, deshalb kann ein Bild mehrmals erscheinen. Wenn die Abfrage korrekt definiert ist, sollten Sie etwas Ahnliches wie in Abbildung 15.5 sehen.

Abbildung 15.4:  Binden Sie Ihr Bild zum image-Feld in Ihrer Datensatzgruppe rsBanner.

Abbildung 15.5:  Jetzt sollten Sie ein Banner-Bild sehen. Klicken Sie auf die Schaltfläche Aktualisieren, um ein zufällig ausgewähltes neues Bild anzuzeigen.

Jetzt fügen Sie den Link vom Banner zu einer externen URL ein. Das ist dem Prozess ganz ähnlich, den Sie eben ausgeführt haben. Markieren Sie das gesamte Banner-Bild (das können Sie gegebenenfalls auch im Live Data-Modus tun) und wählen Sie im Modifizieren-Menü die Option Link erstellen. Auch jetzt werden Sie nach der Datei gefragt, zu der der Link führen soll. Wie bei der Bildquelle wählen Sie die Option Dateinamen wählen aus Datenquellen. Statt das Bildfeld wählen Sie jetzt das URL- Feld und klicken auf OK, wie in Abbildung 15.6 gezeigt. Auf diese Weise wird die URL aus der Datenbank zu dem Link gebunden.

Damit haben Sie das grundlegende Banner-Programm fertiggestellt. Versuchen Sie, die Seite in Ihren Browser zu laden, und beobachten Sie, was passiert. Sie haben ein komplett zufallsgesteuertes Bild in Ihrem Dokument. Das ist nun kein offensichtlicher Verwendungszweck für UltraDev, aber durchaus sinnvoll.

Abbildung 15.6:  Setzen Sie die Datenbindung auf das zweite URL-Feld.

Die Reihenfolge der Datensatzgruppen ist bei jeder Abfrage der Datenbank zufällig. Das bedeutet jedoch nicht, dass Sie Ihr dynamisches Bild innerhalb einer Seite an beliebige Positionen kopieren können und dabei mehrere Auftreten zufallsgesteuert werden. Dazu müssen Sie mehrere Datensatzgruppen auf derselben Abfrage basierend definieren. Jede dieser Datensatzgruppen wiederum kann ein einziges zufallsgesteuertes Bild steuern.

Dieses Projekt ist zwar einfach, aber es wurde für fast jede kommerzielle Site gefordert, die ich entwickelt habe. Normalerweise wird es durch ein separates CGI gesteuert - aber mit UltraDev können Sie die Funktionsweise mit der Bequemlichkeit einer Zeigen-und-Klicken-Oberfläche realisieren.

Dem Projekt fehlt jedoch noch eine Funktionsweise - die Möglichkeit, sich zu merken, welches Bild ein Benutzer zuletzt gesehen hat, und dieses Bild beim nächsten Besuch der Seite nicht zu laden. Sie könnten diese Funktion implementieren, indem Sie ein Cookie mit dem gewählten Dateinamen setzen und dann die Datensatzgruppe ausfiltern, in der der Bilddateiname ungleich dem Cookie-Wert ist. Das ist eine komplexe Funktion, die eine manuelle Bearbeitung des HTML-Codes erforderlich macht - mehr darüber erfahren Sie in Kapitel 17, »Komplexe Techniken: Benutzerdaten verfolgen und verwenden«.

15.3 Jahreszeitlich/tageszeitlich unterschiedliche Bilder

Eine weitere beliebter Verwendungsweck dynamischer Bilder, den Sie auch Ihrer Website hinzufügen können, ist ein Bild, das sich entsprechend der Tageszeit oder Jahreszeit ändert. Das ist sehr praktisch, wenn Sie vordefinierten Inhalt verwenden, der automatisch aktualisiert wird, wenn ein bestimmtes Datum erreicht ist. Beispielsweise könnten Sie Ihre Web-Grafik abhängig von der Jahreszeit oder sogar abhängig vom Monat anzeigen, um den Eindruck zu erwirken, dass die Site ständig weiterentwickelt wird, selbst wenn Sie die Seiten überhaupt nicht betreuen müssen.

Dieses Projekt ist dem Hinzufügen von Banner-Anzeigen ganz ähnlich, verwendet aber eine etwas abgeänderte Abfrage- und Tabellendefinition.

Tabellendefinition

Wie im vorhergehenden Beispiel gezeigt, ist die Tabellendefinition für diese dynamischen Bilder ganz einfach. Sie speichern den Bilddateinamen zusammen mit einem Datum oder einer Zeit. Die Implementierung, die ich Ihnen hier vorstelle, basiert darauf, dass ein bestimmtes Bild zu einem bestimmten Datum angezeigt wird. Nachdem Sie diesen Abschnitt gelesen haben, können Sie die Datenbanktabellen abändern und die Anzeige des Bildes von dem Wochentag, der Woche, dem Monat oder verschiedenen anderen Optionen abhängig machen.

Eine grundlegende auf einem Datum basierende Tabellendefinition könnte wie folgt aussehen:

create table   tblTimebasedImage (
image varchar (80) not null,
activedate date,
primary key (image)
)

Abbildung 15.7 zeigt das Tabellenlayout für eine einfache zeitbasierte Bild-Applikation.

Abbildung 15.7:  Von der Zeit abhängig angezeigte Bilder werden mithilfe einer Tabelle realisiert, die der für die zufällig ausgewählten Bilder ganz ähnlich ist.

Das SQL

MySQL stellt verschiedene Funktionen bereit, die Ihnen erlauben, die Daten abhängig von Datumswerten ganz schnell zu manipulieren. Sie können diese Funktionen kombinieren, um von Zeit und Datum abhängige Abfragen in den von Ihnen entwickelten Systemen zu realisieren:

DAYOFWEEK(<datum>) - Gibt einen numerischen Wert zurück, der den Wochentag darstellt. 1 = Sonntag, 2 = Montag usw.

DAYOFYEAR(<datum>) - Gibt den Tag des Jahres zurück. Beispielsweise ist der 1. Januar der 1. Tag des Jahres, während der 31. Dezember der 365. Tag ist.

DAYNAME(<datum>) - Der Name des Wochentags anstelle eines numerischen Werts.

MONTHNAME(<datum>) - Der Name des Monats für das vorgegebene Datum.

WEEK(datum) - Erzeugt ein numerisches Ergebnis mit der Woche (1-52) des Jahres, in der das vorgegebene Datum liegt.

CURDATE() - Das aktuelle Datum.

CURTIME() - Die aktuelle Zeit.

NOW() - Das aktuelle Datum und die aktuelle Zeit.

Eine vollständige Liste der von MySQL unterstützten Funktionen finden Sie in Anhang C, der eine schnelle MySQL-Funktionsreferenz enthält.

Um in diesem Beispiel Zeit zu sparen, verwenden wir dieselben Banner-Abbildungen wie zuvor - außer dass wir sie abhängig von der Zeit oder dem Jahr anzeigen, statt sie zufällig auszuwählen. Tragen Sie Beispieldaten in die Tabelle ein. Falls die Daten in diesem Beispiel bereits abgelaufen sind, tragen Sie aktuellere Daten ein, sodass sie noch wirksam sind.

insert into tblTimebasedImage  values ('banners/fade.gif','2000-11-30');
insert into tblTimebasedImage values ('banners/buddy.gif','2001-02-28');
insert into tblTimebasedImage values ('banners/detailing.gif','2001-05-30');

Der Trick dabei ist, die Abfrage auszulösen. Offensichtlich muss man das aktuelle Datum kennen - das beispielsweise von CURDATE() oder NOW() zurückgegeben wird - aber Sie können nicht einfach das gespeicherte Datum und die Ergebnisse der Funktion NOW() vergleichen. Auf diese Weise würde der Datensatz nur dann zurückgegeben, wenn das betreffende Datum gerade das aktuelle Datum ist. Wir versuchen aber, ein System aufzubauen, das ein Bild auswählt, nachdem das Zieldatum vergangen ist. Dazu wählen Sie Datensätze in der Datenbank aus, die ein höheres als das aktuelle Datum haben:

mysql> select * from tblTimebasedImage 
where activedate > CURDATE() ORDER BY activedate;
+-----------------------+------------+
| image | activedate |
+-----------------------+------------+
| banners/fade.gif | 2000-11-30 |
| banners/buddy.gif | 2001-02-28 |
| banners/detailing.gif | 2001-05-30 |
+-----------------------+------------+
3 rows in set (1.19 sec)

Die ORDER BY-Klausel ist erforderlich um sicherzustellen, dass sich das nächste Datum ganz oben in der Tabelle befindet. Wenn Sie diesen Wert weglassen, erhalten Sie die Ergebnisse, die eine Übereinstimmung in der Reihenfolge erzeugen, in der sie in die Tabelle eingetragen wurden.

Ähnlich wie bei den zufällig ausgewählten Banner-Bildern sind Sie nur an dem ersten Ergebnis der Abfrage interessiert. Entweder Sie ignorieren die folgende Strategie und verwenden nur den ersten Datensatz in der Datensatzgruppe, oder Sie begrenzen die Abfrage mithilfe der LIMIT-Klausel:

mysql> select * from tblTimebasedImage 
where activedate > CURDATE() ORDER BY activedate LIMIT 1;
+------------------+------------+
| image | activedate |
+------------------+------------+
| banners/fade.gif | 2000-11-30 |
+------------------+------------+
1 row in set (0.71 sec)

Damit erhalten Sie ein Bild, das zu einem bestimmten Datum aktiviert wird.

Anschließend gehen Sie wie für das zufällig ausgewählte Banner-Bild vor, um es Ihrer Seite hinzuzufügen:

  1. Fügen Sie eine rsTimebasedImage-Datensatzgruppe in Ihr Dokument ein, die die eben definierte Abfrage enthält. Abbildung 15.8 zeigt eine korrekt definierte Datensatzgruppe.
  2. Fügen Sie ein Bild auf der Seite ein, die zu dem Bildfeld Ihrer neuen Datensatzgruppe gebunden ist.

    Abbildung 15.8:  Definieren Sie eine komplexe Abfrage, ähnlich wie für das Banner-Bild.

Wie Sie sehen, ist das Ganze ein bisschen einfacher als mit dem zufällig ausgewählten Bild, weil wir es nur mit einem Feld in der Datenbank zu tun haben. Leider sind unsere beiden Beispiele zwar ganz nett, aber für sehr große Projekte sind sie nicht geeignet.

Mehrere Jahreszeit-/zeitbasierte Bilder

Zeitbasierte Bilder sind so praktisch, weil Sie nicht darauf achten müssen, wann Änderungen stattfinden müssen. Sie gehen abends ins Bett, werden von Aliens entführt und unverletzt auf der internationalen Weltraumstation abgesetzt. In der Zwischenzeit muss sich Ihr Server um Ihre Site kümmern.

Das Problem bei den bisher definierten, von der Jahreszeit abhängigen Bildern ist, dass das Ganze für ein einziges Bild funktioniert. Alle Bilder in der Tabelle tblTimebasedImage werden als Variationen derselben Grafik betrachtet. Ideal wäre ein themenbasiertes System, wobei unterschiedliche Bilder in einer Tabelle abgelegt und einer Gruppe von Datumswerten zugeordnet werden könnten. Die einzige Methode, wie Sie dies für das aktuelle System bewerkstelligen können, ist die Einrichtung einer neuen Tabelle für jedes Bild. Wir brauchen also unbedingt eine neue Technik.

Dazu definieren Sie die bereits existierende Tabelle um und fügen eine neue Tabelle ein:

create table tblTimebasedImage (
image varchar (80) not null,
name varchar(80) not null,
themeID varchar(80) not null,
primary key (image,name,themeID)
)

Die neue Definition von tblTimebasedImage beinhaltet eine Themen-ID, die in der zweiten Tabelle definiert wird, sowie einen Namen. Das Feld name identifiziert ein Bild anhand eines abstrakten Namens statt, und nicht anhand eines Dateinamens. Auf diese Weise können Sie ein Bild beispielsweise namens HauptTitel für ein beliebiges Thema verwenden, auch wenn der tatsächliche Dateiname der verschiedenen Themen variiert.

create table tblTheme (
themeID varchar(80) not null,
activedate date,
primary key (themeID)
)

Die Thementabelle ordnet einem Aktivierungsdatum eine Themen-ID (ThemeID) zu. Beispielsweise könnten Sie das Thema Weihnachten einfügen, das dem Datum 12/25/ 20XX zugeordnet wird. Abbildung 15.9 zeigt das neue Datenbankschema.

Abbildung 15.9:  Das neue zeitbasierte Schema verwendet zwei Tabellen - eine für die Bilder und eine für die einem Aktivierungsdatum zugeordneten Themen.

Das SQL

Am besten verstehen Sie, wie ein System funktioniert, indem Sie Beispieldaten anlegen und die Abfragen ausprobieren:

insert into tblTimebasedImage values ('mainimage1.jpg','header','Sommer');
insert into tblTimebasedImage values ('mainimage23.jpg','header','Winter');
insert into tblTimebasedImage values ('mainimage65.jpg','header','Herbst');
insert into tblTimebasedImage values ('mainimage2.jpg','header','Fruehling');

insert into tblTheme values ('Sommer','2000-06-21');
insert into tblTheme values ('Winter','2000-12-21');
insert into tblTheme values ('Herbst','2000-09-21');
insert into tblTheme values ('Fruehling','2000-03-21');

Diese Datenmengen gelten für vier verschiedene Themen (Sommer, Winter, Herbst und Frühling) sowie vier verschiedene Titelgrafiken. Dieses System ist besser als die vorhergehende Tabellenstruktur, weil es Ihnen erlaubt, unterschiedliche Bilder innerhalb derselben Tabelle zu speichern (auch neben der Titelgrafik).

Um dieses neue Layout nutzen zu können, ändern Sie das zuvor gezeigte SQL so ab, dass es die beiden Tabellen in Verbindung bringt und ein Bild nach seinem abstrakten Namen auswählt:

SELECT * FROM tblTimebasedImage where activedate > CURDATE() 
ORDER BY activedate LIMIT 1;

Daraus wird

SELECT * FROM tblTimebasedImage,tblTheme WHERE 
tblTimebasedImage.themeID=tblTheme.themeID
AND tblTheme.activedate > CURDATE()
AND tblTimebasedImage.name='header'
ORDER BY tblTheme.activedate LIMIT 1;

Weil Sie noch nicht viel Erfahrung mit komplexen Abfragen besitzen, wollen wir diese zerlegen und erklären, was sie genau bewirkt.

tblTimebasedImage.themeID=tblTheme.themeID - Bringt die beiden Tabellen (die Bildtabelle und die Thementabelle) abhängig von der themeID in eine Verbindung.

tblTheme.activedate > CURDATE() - Vergleicht das aktuelle Datum mit dem Aktivierungsdatum in der Tabelle tblTheme.

tblTimebasedImage.name='header' - Wählt das Bild nicht nur basierend auf dem activedate, sondern auch auf dem abstrakten Namen für jedes der Felder aus.

Um dieses überarbeitete System nutzen zu können, aktualisieren Sie Ihre Datenbank und ersetzen Ihre Abfragen. Sie müssen immer noch für jedes der anzuzeigenden Bilder eine neue Abfrage definieren. Das ist jedoch eine Verbesserung im Vergleich zum ursprünglichen System, weil Sie dort für jedes zeitabhängige Bild, das Sie einfügen wollten, eine neue Tabelle anlegen mussten.

Wie bereits erwähnt, bietet UltraDev momentan nicht die Möglichkeit, Bilder oder andere binäre Objekte direkt in der Datenbank zu speichern. Das wird sich in Zukunft jedoch hoffentlich ändern, damit Sie Applikationen entwickeln können, die Ihnen erlauben, neue Site-Bilder usw. direkt in die Datenbank hochzuladen. Das ist jetzt auch schon möglich, aber dafür ist eine benutzerdefinierte Programmierung erforderlich, um die Daten entgegennehmen, in einer Datei speichern und dann aus der Datenbank darauf verweisen zu können.

15.4 Feed-back von Ihren Benutzern entgegennehmen

Das letzte Mini-Projekt für heute ist ein Gästebuch. Die Vorteile bei der Bereitstellung eines Gästebuchs für Ihre Benutzer ist, dass sie nicht den Eindruck haben, ihr Feed-back gehe »ins Nichts«. Wie oft haben Sie schon eine Website besucht und auf einen Link geklickt, um einen Kommentar zu hinterlassen, und es hat sich einfach nur Ihr E-Mail- Programm geöffnet, damit Sie eine Nachricht an eine namen- und gesichtslose Person hinterlassen können, die Ihnen nie eine Antwort schicken wird. Ein Gästebuch erlaubt dem Benutzer, einen Kommentar auf einer Website zu hinterlassen - etwas, was nicht so einfach ignoriert werden kann.

Ich bin sicher, Sie haben sich schon Gedanken darüber gemacht, welche Nachrichten ein Benutzer in einem Gästebuch hinterlassen kann - und das ist durchaus gerechtfertigt. Häufig nutzen unfreundliche Zeitgenossen ein öffentliches Forum, um ihre Unreife zu demonstrieren. Eine unangemessene Sprache, eingebettete Bilder und unangebrachte HTML-Tags im Klartext usw. - es gibt unzählige potenzielle Probleme. Bleibt zu hoffen, dass unser Gästebuch einige dieser Ungezogenheiten kompensieren kann.

Die Tabellendefinition

Der Inhalt der Gästebuch-Tabelle bleibt völlig Ihnen überlassen. Wie viel Information wollen Sie speichern? Das Beispiel-Gästebuch in diesem Kapitel speichert einen Benutzernamen, eine E-Mail-Adresse und einen Kommentar.

Eine entsprechende Tabelle könnte wie folgt definiert werden:

create table tblcomment (
messageID int auto_increment not null,
name varchar(50),
email varchar(80),
message varchar(250),
primary key (messageID)
);

Hier verwenden Sie zum ersten Mal den Typ auto_increment für die messageID. Diese Funktion inkrementiert das Feld automatisch, wenn ein neuer Datensatz eingetragen wird. Sie brauchen sich keine Gedanken darüber zu machen, diese Nummer manuell erstellen zu müssen. Leider ist das von Datenbank zu Datenbank verschieden, und für Ihr System verhält es sich vermutlich anders. Wenn Sie nicht MySQL einsetzen, könnten Sie auch die eigentliche Nachricht als Primärschlüssel verwenden, weil es sehr unwahrscheinlich ist, dass mehrere Personen genau dieselbe Nachricht hinterlassen.

Weil es kaum andere Informationen gibt, die wir speichern müssen, oder die sich auf die Kommentar-Datenbank beziehen, kann die endgültige Datenstruktur wie in Abbildung 15.10 aussehen:

Abbildung 15.10:  In der Kommentar-Tabelle werden eine Nachricht und  beliebige andere Felder abgelegt.

Das SQL

Das SQL zur Auswahl und zur Anzeige der verfügbaren Kommentare im Gästebuch sollte klar sein:

SELECT * FROM tblcomment;

Es könnte eine Datensatzgruppe definiert werden, die alle Nachrichten enthält, und dann auf die Felder ein wiederholter Bereich angewendet werden, um eine Liste aller Nachrichten anzulegen. Damit werden jedoch einige Probleme nicht gelöst - insbesondere die Reihenfolge, in der die Nachrichten angezeigt werden, sowie die Tatsache, dass eine Nachricht nicht immer so gestaltet ist, als dass wir sie anzeigen möchten.

Am besten demonstrieren wir das Ganze, indem wir Daten in die Kommentar-Tabelle einfügen. Um höflich zu bleiben, werde ich einige wohlwollende Kommentare in die Datenbank einfügen und dann zeigen, wie man sie ausfiltert. Sie sollten den Filter so abändern, dass wirklich derbe Einträge ausgefiltert werden, wenn Sie das System auf Ihrem Server einsetzen.

insert into tblcomment values ('','John Ray','jray@poisontooth.com',
'Die ultimative Website! Mehr kann man nicht verlangen!');
insert into tblcomment values ('','Robyn Nest','robyn@nospammingme.com',
'So ein Quatsch!');
insert into tblcomment values ('','Bad Dude','ads@adsrus.com',
'Vergessen Sie diese Site! Besuchen Sie <a href="http://www.badplacesforyou.com/"></a>');

Von diesen Beispielnachrichten sollte nur die erste angezeigt werden.

Die zweite Nachricht ist hier moderat, aber es könnte noch schlimmer kommen. Und die dritte Nachricht enthält einen Link auf eine andere Site - und wir wollen keine Nachrichten anzeigen, in die der Benutzer sein eigenes HTML eingebettet hat.

Um die Nachrichten zu filtern, verwenden Sie eine partielle Übereinstimmung in der Abfrage, um alle Wörter zu blockieren, die nicht erscheinen sollen.

Führen Sie beispielsweise folgende Abfrage für die Beispieldaten aus:

mysql> SELECT * FROM tblcomment WHERE message NOT LIKE "%QUATSCH%" \ G
*************************** 1. row ***************************
messageID: 1
name: John Ray
email: jray@poisontooth.com
message: Die ultimative Website! Mehr kann man nicht verlangen!
*************************** 2. row ***************************
messageID: 3
name: Bad Dude
email: ads@adsrus.com
message: Vergessen Sie diese Site! Besuchen Sie
<a href="http://www.badplacesforyou.com/"></a>
2 rows in set (0.01 sec)

Diese Nachricht ist nach der Klausel WHERE message NOT LIKE "%QUATSCH%" gefiltert. Diese Abfrage filtert abhängig von dem Muster im message-Feld. In diesem Fall ist das Muster das Wort »Quatsch«, wobei vorher und nachher beliebige Zeichen stehen dürfen, dargestellt durch das Prozentsymbol. Sie können beliebig viele dieser Bedingungen kombinieren.

Um beispielsweise einen Filter anzulegen, der die Wörter »Mist«, »Dreck« und »Runkelrüben« ausschließt, schreiben Sie Folgendes:

SELECT * FROM tblcomment WHERE message NOT LIKE "%MIST%" 
AND message NOT LIKE "%DRECK%" AND message NOT LIKE "%RUNKELRÜBEN%".

Wie Sie sehen, muss die Abfrage einfach nur durch die neuen Bedingungen ergänzt werden. Weil wir alle Nachrichten ausfiltern wollen, die ein HTML-Tag enthalten, sollte die ursprüngliche Abfrage wie folgt umgeschrieben werden:

mysql> select * from tblcomment 
WHERE message NOT LIKE "%QUATSCH%" AND message NOT LIKE "%<%>%" \ G
*************************** 1. row ***************************
messageID: 1
name: John Ray
email: jray@poisontooth.com
message: Die ultimative Website! Mehr kann man nicht verlangen!
1 row in set (0.07 sec)

Genau danach haben wir gesucht. Die Nachricht mit dem enthaltenen HTML wurde nach einem Muster ausgefiltert, das <> enthält, mit beliebigen Zeichen dazwischen und links und rechts. In einem letzten Schritt könnten Sie am Ende der Abfrage ORDER BY messageID DESC einfügen, sodass die neueste Nachricht als erste angezeigt wird.

Die hier definierte Abfrage filtert alles aus, was irgendwie an ein HTML-Tag erinnert, nämlich alles, was ein <, gefolgt von einem >, enthält. Sie können nicht jedes HTML-Tag als Muster definieren, aber Sie könnten einige derjenigen explizit angeben, die Sie ausfiltern wollen, wie beispielsweise <A HREF> oder <IMG>.

Jetzt wollen wir das HTML anlegen, um das Gästebuch online bereitzustellen.

15.5 Das HTML

Ähnlich den beiden ersten Projekten in diesem Beispiel werden wir den Plan der Site hier überspringen, weil das Gästebuch nur eine einzige Seite einnimmt. Diese Seite enthält ein kurzes Formular, mit dem die Benutzer Kommentare übertragen können, sowie direkt darunter die eigentlichen Kommentare.

Zunächst richten Sie das Formular für die Eingabe neuer Kommentare ein. Öffnen Sie die Objektpalette und gehen Sie zu den Formularelementen. Wie für jede Seite, die ein Formular enthält, müssen Sie als Erstes das eigentliche Formularobjekt einfügen - ohne das Formular-Tag erscheinen die enthaltenen Elemente nicht. Das Dokument sieht in der Entwurfsaussicht gut aus, aber in Ihrem Webbrowser wird es nicht angezeigt. Fügen Sie also ein neues Formular in Ihr Dokument ein und geben Sie ihm den Namen frmComment - Sie speichern den Inhalt dieses Formulars in der Gästebuch-Datenbank. Wenn Sie nicht mehr wissen, wie man einem Formular einen Namen zuweist, gehen Sie wie folgt vor:

  1. Öffnen Sie die Eigenschaftenpalette.
  2. Klicken Sie unten in der Entwurfsansicht auf das Formular-Tag, um das Formular zu markieren.
  3. Setzen Sie den Formularnamen auf frmComment.

Anschließend fügen Sie die benötigten Elemente in das Formular ein. Dazu könnten Sie zunächst eine Tabelle einfügen, um das Layout des Formulars zu strukturieren. Sie benötigen drei Felder mit den folgenden Namen:

Diese Namen fügen Sie Ihrem Dokument mithilfe des Textfeldobjekts im Formularabschnitt der Objektpalette hinzu. Die Felder name (Name) und email (E-Mail) sind normale Textfelder (der Standardfeldtyp, den UltraDev einfügt), während Sie das message-Feld (Kommentar) so anpassen müssen, dass es mehrere Zeilen unterstützt. Markieren Sie das message-Feld in der Entwurfsansicht und öffnen Sie den Eigenschafteninspektor. Markieren Sie das Optionsfeld Mehrzeilig, um den Feldtyp zu ändern.

Das mehrzeilige Textfeld hat eigentlich nichts mit dem einzeiligen und dem Kennwortfeld zu tun. Es handelt sich dabei um ein völlig anderes Formularobjekt, das als Textbereich bezeichnet wird und mehrere Eingabezeilen entgegennehmen kann.

Schließlich fügen Sie dem Formular eine Senden-Schaltfläche hinzu. Durch Anklicken dieser Schaltfläche wird der neue Kommentar in der Datenbank gespeichert. Abbildung 15.11 zeigt die endgültige Version des Formulars.

Abbildung 15.11:  Ein Beispiel für ein Kommentarformular; Sie können natürlich auch ein beliebiges anderes Layout verwenden.

Der letzte Schritt, mit dem das Formular funktional gemacht wird, ist das Hinzufügen des Serververhaltens Datensatz einfügen. Damit wird der Datenbank der neue Kommentar hinzugefügt:

  1. Öffnen Sie die Palette Serververhalten.
  2. Klicken Sie auf das Plussymbol (+), und wählen Sie Datensatz einfügen.
  3. Geben Sie die für dieses Projekt definierte Verbindung an.
  4. Wählen Sie für In Tabelle einfügen die Tabelle tblcomment.
  5. Wählen Sie im Bereich Werte abrufen aus: das Formular frmComment.
  6. Die einzelnen Formularelemente sollten mit den Feldern in der Datenbank übereinstimmen. Falls sie nicht übereinstimmen, markieren Sie eines der Formularelemente und wählen Sie dann die Datenbankspalte aus, mit der es übereinstimmen soll, sowie ihren Datentyp.
  7. Nachdem Sie mit dem Einfügen fertig sind, gehen Sie auf die Seite zurück. Ich habe meine Seite als guestbook.asp abgespeichert.

Abbildung 15.12 zeigt das entsprechend definierte Verhalten.

Abbildung 15.12:  Die Formularelemente müssen mit den Datenbankfeldern übereinstimmen.

Jetzt müssen Sie nur noch eine Datensatzgruppe einfügen, um die vorhandenen Kommentare anzuzeigen. Weil wir das SQL bereits definiert haben, muss es nur noch in das System eingetragen werden:

  1. Öffnen Sie die Palette Serververhalten.
  2. Klicken Sie auf die Schaltfläche mit dem Plussymbol (+) und wählen Sie Datensatzgruppe (Abfrage).
  3. Klicken Sie auf die Schaltfläche Erweitert, um in den erweiterten Modus zu gelangen, falls das noch nicht geschehen ist.
  4. Wählen Sie Ihre Datenbankverbindung.
  5. Geben Sie der neuen Datensatzgruppe den Namen rsComment.
  6. Fügen Sie das folgende SQL in das Abfragefenster ein: SELECT * FROM tblcomment WHERE message NOT LIKE '%QUATSCH%' AND message NOT LIKE '%<>%' ORDER BY messageID DESC.
  7. Klicken Sie auf OK.

Haben Sie einen Unterschied bemerkt? Der Code hat sich geändert. Statt %<%>% verwenden wir %<>%. Wenn Sie nicht ASP verwenden, können Sie die ursprüngliche Abfrage ohne diese Änderung einfügen. Das Problem dabei ist, dass <% und %> einen eingebetteten ASP-Befehl kennzeichnen. Wenn Sie also die Abfrage unverändert eingeben, wird das System verwirrt - und letztlich wird es das in das Dokument eingefügte Serververhalten zerstören.

Nachdem Sie dieses veränderte Verhalten eingefügt haben, bearbeiten Sie den Code manuell, sodass die Abfrage korrigiert wird. Sie können das % nicht dort einfügen, wo es hingehört, weil UltraDev/ASP erkennt, dass es sich dabei um ein ASP-Tag handelt. Statt dessen speichern Sie es in einer separaten Variablen und fügen diese Variable dann in die Abfrage ein.

Öffnen Sie Ihr Dokument, und suchen Sie nach einem Code-Abschnitt ähnlich dem folgenden:

<%
set rsComment = Server.CreateObject("ADODB.Recordset")
rsComment.ActiveConnection = MM_connChapter15_STRING
rsComment.Source = "select * from tblcomment
WHERE message NOT LIKE '%QUATSCH%' AND message
NOT LIKE '%<>%' ORDER BY messageID DESC"
rsComment.CursorType = 0
rsComment.CursorLocation = 2
rsComment.LockType = 3
rsComment.Open
rsComment_numRows = 0
%>

Wenn Sie Probleme haben, Code in Ihrem Dokument zu finden, verwenden Sie die Funktion Suchen im Bearbeiten-Menü.

In diesem Abschnitt legen Sie die Datensatzgruppe an und definieren die Abfrage. Ändern Sie diesen Code so ab, dass er eine neue Variable pc enthält, die manuell mit der Abfrage verknüpft wird:

<%
set rsComment = Server.CreateObject("ADODB.Recordset")
rsComment.ActiveConnection = MM_connChapter15_STRING
pc="%"
rsComment.Source = "select * from tblcomment
WHERE message NOT LIKE '%QUATSCH%' AND message
NOT LIKE '%<"+pc+">%' ORDER BY messageID DESC"
rsComment.CursorType = 0
rsComment.CursorLocation = 2
rsComment.LockType = 3
rsComment.Open
rsComment_numRows = 0
%>

In einigen Projekten müssen Sie ab und zu manuell eine Funktion einfügen - machen Sie sich also damit vertraut, wie Sie Ihre Wege durch den UltraDev-Code finden. Manchmal ist es die einzige Möglichkeit, ein Projekt zum Laufen zu bringen.

Schließen Sie die HTML-Ansicht, nachdem Sie Ihre Änderungen vorgenommen haben; das ist alles, was Sie außerhalb der UltraDev-Oberfläche erledigen müssen.

Jetzt definieren Sie ein Layout für die Kommentarliste. Ich verwende dafür nur eine zweizeilige Tabelle - eine Zeile enthält den Kommentar, die andere den Namen des Autors. Die E-Mail-Adresse wird (in meiner Version) nur für den Administrator gespeichert und im Gästebuch nicht angezeigt.

Öffnen Sie das Fenster Datenbindungen und expandieren Sie die Datensatzgruppe rsComment. Das Fenster Datenbindungen sieht aus wie in Abbildung 15.13 gezeigt.

Abbildung 15.13:  Ihr Fenster für die Datenbindungen sollte  wie hier gezeigt aussehen.

Ziehen Sie die Felder für die Nachricht und den Namen aus dem Fenster für die Datenbindung in Ihr Layout. Damit wird der erste Datensatz der definierten Datensatzgruppe angezeigt, aber was ist mit den anderen?

Um mehrere Datensätze anzuzeigen, brauchen Sie das Serververhalten Bereich wiederholen:

  1. Markieren Sie den Bereich, der wiederholt werden soll (die Felder für Name und Nachricht).
  2. Öffnen Sie die Palette Serververhalten.
  3. Klicken Sie auf das Plussymbol (+), und wählen Sie Bereich wiederholen.
  4. Wählen Sie im Konfigurationsdialog für Bereich wiederholen, den Sie in Abbildung 15.14 sehen, die Datensatzgruppe rsComment aus.
  5. Geben Sie die maximale Anzahl der Nachrichten ein (Wiederholungen), die Sie anzeigen wollen.
  6. Klicken Sie auf OK.

    Abbildung 15.14:  Geben Sie an, wie viele Datensätze angezeigt werden sollen.

Damit haben Sie alle Projekte Ihres ersten Projekttags erfolgreich abgeschlossen. Abbildung 15.15 zeigt den letzten Dokumententwurf. Testen Sie das System - versuchen Sie, ein paar Kommentare in die Datenbank einzutragen. Experimentieren Sie ein bisschen mit den Filteroptionen. Dazu sollten Sie jetzt Wörter wählen, die Sie in einem realen System auch ausfiltern würden.

Abbildung 15.15:  Der endgültige Entwurf des Gästebuchs

15.6 Zusammenfassung

Die heutigen Projekte haben ein paar einfache, schnelle Codeabschnitte vorgestellt, die Sie existierenden, statischen Websites hinzufügen können, um sie attraktiver zu machen und eine gesteigerte Funktionalität zu bieten. Diese Dinge sind Ihnen vielleicht nicht neu, aber das Kapitel hat Ihnen Informationen darüber bereitgestellt, wie sie realisiert werden - was für den Anfänger nicht unbedingt als einfach erachtet wird.

Die Verwendung von SQL-Funktionen erhöht die Funktionalität, die Sie mit UltraDev besitzen. UltraDev ist in seiner aktuellen Version ein Werkzeug, das es Ihnen ermöglicht, Informationen in einer Datenbank anzuzeigen und sie einzufügen. Nicht mehr und nicht weniger. Es bleibt Ihnen überlassen, die Vorteile Ihrer UltraDev-Umgebung mit den Vorteilen Ihres Datenbankservers zu kombinieren.

Leider mussten Sie auch erfahren, dass UltraDev Schwächen hat. Die manuelle Bearbeitung des Codes nach der Definition einer komplexen Abfrage kommt nicht selten vor, aber normalerweise ist sie nicht schwierig. Merken Sie sich, wo UltraDev seinen Code für den Datenbankzugriff ablegt, um Probleme schneller erkennen und korrigieren zu können.

Die restlichen Tage dieser Woche beschäftigen sich mit der Definition und Implementierung vollständiger Web-Applikationen. Manchmal müssen Sie sich dabei die Hände ein bisschen schmutzig machen, aber ich werde mich bemühen, das Ganze auf ein Minimum zu reduzieren.

15.7 Fragen und Antworten

Frage:
Können Banner-Bilder so eingerichtet werden, dass sie nicht zweimal hintereinander dasselbe Bild anzeigen?

Antwort:
Mithilfe von Cookies kann sich ein Browser merken, welches Bild er zuletzt gesehen hat (und es dem Server mitteilen). Weitere Informationen über Cookies finden Sie in Kapitel 17, »Komplexe Techniken: Benutzerdaten verfolgen und verwenden«.

Frage:
Wie können zeitbasierte Bilder für mehrere Jahre genutzt werden?

Antwort:
In dem erstellten Beispiel laufen die Themen nach einem bestimmten Datum ab und können nicht wiederverwendet werden. Wie im Kapitel beschrieben, stellt MySQL Funktionen bereit, um Daten abhängig vom Monat oder Tag eines Jahres zu vergleichen. Jede dieser Funktionen kann für mehrere Jahre eingesetzt werden.

Frage:
Muss ich die Abfrage %<%>% auch für andere Serverplattformen als ASP abändern?

Antwort:
ASP kennzeichnet mithilfe von <%> eingebetteten Code - deshalb das Problem in UltraDev. Falls Sie eine eingebettete Sprache verwenden, die ihre Tags anders kennzeichnet, sollten Sie dieses Problem nicht haben.

Frage:
Kann ich mein Gästebuch zu einem vollfunktionalen Nachrichtensystem ausbauen?

Antwort:
Warten Sie bis morgen - da werden wir genau das tun!

15.8 Workshop

Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.

Quiz

  1. Was bewirkt %?
  2. Warum erscheinen zufällig ausgewählte Bilder mehrfach hintereinander?
  3. Warum muss eine separate Variable, die % enthält, in den Code eingefügt werden?
  4. Warum ist es nicht wichtig, wenn für die Applikation mit dem zufällig ausgewählten Banner-Bild und für das zeitbasierte Bild mehrere Bilder zurückgegeben werden?
  5. Was bewirkt die Funktion RAND() in MySQL?

Übungen

  1. Überlegen Sie, ob Sie für das Banner-Programm Cookies einsetzen können, sodass nicht zweimal hintereinander dasselbe Bild erscheint - nachdem Sie Kapitel 17 gelesen haben.
  2. Ändern Sie die Abfrage für die jahreszeitlichen Themen ab, sodass die Bildauswahl auf dem Tag im Jahr basiert. Auf diese Weise können Sie spezielle Datumswerte (Neujahr usw.) sowie bestimmte Jahreszeiten (Frühling, Sommer, Herbst) angeben.
  3. Fügen Sie mit dem Wissen aus Kapitel 10 die Möglichkeit ein, sich durch mehrere Kommentar-Bildschirme zu bewegen.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH