31 Fortgeschrittene Techniken
Mit zunehmender Erfahrung werden Sie an die Grenzen von Dreamweaver 8 stoßen und eigene Abfragen oder Skripts einbinden wollen. Dreamweaver 8 unterstützt Sie auch dabei ganz hervorragend.
31.1 SQL-Abfragen
31.1.1 Eigene SQL-Abfragen einbinden
Häufig werden Sie mit PHP mehrere Tabellen gleichzeitig abfragen wollen. Im erweiterten Modus des Datensatzabfragefensters können Sie SQL-Abfragen mit Hilfe von Dreamweaver 8 erstellen oder auch eigene anlegen. In unserem Beispiel sollen die Bestellvorgänge einzelner Kunden angezeigt werden. Unsere Datenbank enthält in einer der Tabellen die Kundendaten und in einer weiteren die Bestellnummern eines jeden Bestellvorganges. In einer dritten Tabelle werden die Bestellnummern dann den Kunden zugeordnet. Die im Schema grau angezeigte Tabelle soll mögliche Detailverknüpfungen darstellen. Diese graue Tabelle ist in unserer Beispieldatenbank allerdings nicht vorhanden.
Abbildung 31.1 Datenbankschema
Im späteren Dokument soll eine Liste ausgegeben werden, in der pro Bestellung eine Zeile mit Kunde und Bestellnummer angezeigt wird. Bestandskunden, die keine Bestellungen getätigt haben, werden nicht angezeigt.
- Mayer – 2003 – 10010
- Mayer – 2003 – 10011
- Mayer – 2003 – 10012
- Müller – 2003 – 10020
- Koch – 2003 – 10030
- Koch – 2003 – 10031
- Koch – 2003 – 10032
- Koch – 2003 – 10036
In der Praxis könnte es durchaus eine ähnliche Anforderung geben. Die abzufragenden Tabellen sind dann meistens umfangreicher. Um das Prinzip zu verdeutlichen, reicht unser Beispiel aus, und es verwirrt nicht durch zusätzliche Datenfelder.
Aus der Abbildung 31.2 können Sie die Struktur der Tabellen mit den einzelnen Datenfeldern entnehmen. Die Primärschlüssel der Tabellen werden in den Feldern »kunden_ID«, »bestell_ prod_ID« und »bestell_ID« gesetzt.
Abbildung 31.2 Struktur der Kunden-, Bestellnummern- und Zuordnungstabelle
Abbildung 31.3 Daten der Kunden-tabelle
Abbildung 31.4 Bestellnummerntabelle
In der Zuordnungstabelle befinden sich die Primärschlüssel der beiden anderen Tabellen als Zuordnungskriterium. Datensätze aus Primärschlüsseln anderer Tabellen bezeichnet man auch als Fremdschlüssel.
Abbildung 31.5 Daten der Zuordnungstabelle
Nachfolgend eine kurze Übung, wie Sie eigene SQL-Abfragen in Dreamweaver 8 einbinden können. Wir empfehlen Ihnen, diese Anleitung zu lesen, auch wenn Sie die Schritte nicht nachvollziehen, da einige Grundlagen erläutert werden. Zum Aufbau der Buchwebsite müssen Sie diese nicht nachvollziehen.
Schritt für Schritt: SQL-Abfragen einbinden
1 Datenbankanbindung erstellen
Erstellen Sie zunächst eine Datenbankanbindung für die neue Datenbank. Die benötigte Abfrage muss im erweiterten Modus der Dialogbox Datensatzgruppe erfolgen.
2 Anlegen einer Select-Abfrage
SELECT-Befehle können aus mehr als einer Tabelle Daten ausgeben. Markieren Sie dazu die erste gewünschte Tabelle im Fenster Datenbankelemente und klicken auf SELECT . Die Tabelle wird nun mit einer SELECT-Anweisung ins SQL-Fenster geschrieben.
3 Mehrere Tabellen in einer Abfrage
Wenn Sie anschließend die nächste Tabelle markieren und erneut auf SELECT klicken, wird die Tabelle der bestehenden SELECT-Anweisung hinzugefügt. Fügen Sie so alle vorhandenen Tabellen ein.
4 Datensatz ansprechen
Die Kriterien für unsere Abfrage sind die »kunden_ID« in den Tabellen »kunden« und »bestellungen« und die »bestell_prod_ID« aus den Tabellen »bestellungen«, außerdem die Tabelle »bestellnummern«.
Ein Datensatz einer bestimmten Tabelle wird in SQL wie folgt angesprochen:
Tabelle.Datensatz
Daraus ergibt sich für die Zuordnung der Daten folgende Schreibweise:
Listing 31.1 WHERE-Statement
bestellnummern.bestell_prod_ID = bestellungen. bestell_prod_ID AND bestellungen.kunden_ID = kunden.kunden_ID
Um diese Abfrage zu schreiben, wählen Sie einfach der Reihe nach alle abzufragenden Datensätze im Fenster Datenbankelemente aus und klicken nach jeder Auswahl auf WHERE.
Dreamweaver 8 schreibt als Standard für die Verknüpfungen immer die AND-Bedingung. Das ist für unsere Abfrage nicht korrekt. Ändern Sie daher im SQL-Fenster die Abfrage wie in der folgenden Abbildung angeführt.
5 Geänderte Abfrage
Wenn Sie alles korrekt erledigt haben, sieht Ihre fertige Datensatzabfrage jetzt wie in der folgenden Abbildung aus. Die Änderungen haben wir unterstrichen.
6 Ergebnisse prüfen
Die Ergebnisse der Abfrage können Sie durch einen Klick auf Testen überprüfen. Besonders bei komplexen Abfragen empfiehlt es sich, diese Tests vor dem Einbinden der Daten in das Dokument durchzuführen.
7 Datensätze anzeigen
Um alle relevanten Datensätze anzuzeigen, müssen Sie die gewünschten Datensätze wie gewohnt in Ihr Dokument ziehen und einen wiederholten Bereich daraus erstellen.
Hinter den Datensätzen im wiederholten Bereich, haben wir noch einen Zeilenumbruch eingefügt, damit nicht alles in einer Zeile steht, und die einzelnen Felder mit einem Bindestrich getrennt.
8 Ausgabe der Abfrage
In der Live Data-Ansicht sehen Sie die korrekte Ausgabe der Daten. Diese stehen Ihnen für weitere Manipulationen zur Verfügung.
31.1.2 Abfragen verschachteln
In der folgenden Beispielabfrage ist eine andere Darstellung der Daten erwünscht:
- Hauptpunkt 1
|
|
|
- Hauptpunkt 2
|
|
- Hauptpunkt 3
- Hauptpunkt 4
|
|
|
Diese Datenausgabe kommt beispielsweise als dynamisch generiertes Navigationsmenü in Frage. Mit den nun folgenden Tabellen können Unterpunkte beliebigen Hauptpunkten zugeordnet werden. Wenn Sie möchten, können Sie die Unterpunkte auch mehreren Hauptpunkten zuordnen.
Dynamische Navigation | Für Menüs dynamischer Websites reicht diese Technik meist aus. Wenn Sie weitere Zuordnungsoptionen benötigen, zum Beispiel eine völlig freie Konfigurierbarkeit der Menüs, ist jedoch eine andere, kompliziertere Struktur notwendig.
Die für unser Menü benötigten Abfragen können Sie nicht mehr in der grafischen Ansicht von Dreamweaver 8 erstellen. Um die gewünschte Anzeige zu erreichen, müssen verschachtelte Abfragen geschrieben werden. Diese werden von Dreamweaver 8 leider nicht unterstützt.
In Abbildung 31.6 sehen Sie das Schema der Datenbank. Die Unterpunkte aus den Tabellen »menue_sub« werden in der Tabelle »main_sub« den Hauptpunkten in der Tabelle »menue_main« zugeordnet.
Abbildung 31.6 Datenbankschema
Würde diese Datenbank tatsächlich als Navigation einer dynamischen Website dienen, würden den Tabellen für Haupt- und Unternavigationspunkte weitere Felder mit den IDs der in den Unterseiten anzuzeigenden Datensätze angefügt. In den Abbildungen 31.7 bis 31.9 sehen Sie die Datensatzstruktur der Tabellen.
Abbildung 31.7 Schema der Tabelle menue_main
Abbildung 31.8 Schema der Tabelle menue_sub
Abbildung 31.9 Schema der Tabelle main_sub
Wir haben die Tabellen mit den in den Abbildungen 31.10 bis 31.12 dargestellten Inhalten gefüllt.
Abbildung 31.10 Inhalte der Tabelle menue_main
Abbildung 31.11 Inhalte der Tabelle menue_sub
Abbildung 31.12 Inhalte der Tabelle main_sub
In Abbildung 31.13 wird das Prinzip verschachtelter Abfragen schematisch dargestellt.
Abbildung 31.13 Schema einer verschachtelten Abfrage
Wie Sie aus den bisherigen Kapiteln wissen, können die Ergebnisse einer Abfrage als Grundlage für weitere Abfragen verwendet werden. Ein Beispiel dafür ist die Anzeige von Daten in einem Detaildokument nach dem Aufruf aus einem Masterdokument heraus. Dabei wird die ID des anzuzeigenden Datensatzes an das nächste Dokument übergeben.
Abhängige Abfragen | Das gleiche Prinzip funktioniert auch innerhalb eines einzelnen Dokumentes. Abfrage 1 übergibt einen bestimmten Inhalt an Abfrage 2.
Diese liefert nur die Datensätze, die auch mit den aus Abfrage 1 übergebenen Daten übereinstimmen. Der nächste Schritt gleicht dem ersten. Abfrage 2 übergibt die nun gewonnenen Daten an Abfrage 3. Diese gibt wiederum nur die Daten aus, die mit den erhaltenen Daten aus Abfrage 2 übereinstimmen.
Verbindung zur Datenbank | Dieses Prinzip der Verschachtelung können Sie in nahezu beliebiger Tiefe anwenden. Doch zunächst müssen Sie sich wie immer mit der Datenbank verbinden. Wir haben in diesem Beispiel die Verbindung, wie in Listing 31.2 zu sehen, selbst definiert.
Listing 31.2 Datenbankverbindung herstellen
<? // Verbindung zum Server herstellen mysql_connect("localhost","root","") or die ("Zurzeit keine Verbindung möglich"); // Verbindung zur Datenbank "linkliste" herstellen mysql_select_db("abfrage") or die ("Verbindung zur Datenbank zurzeit nicht möglich"); ?>
Erste Abfrage | Im folgenden Listing 31.3 sehen Sie eine einfache Abfrage. Die Ausgabe der Daten erfolgt in einer while-Schleife. Bei jedem Schleifendurchlauf wird der Text aus dem Datensatz »main_view« ausgegeben, da wir den Hauptpunkt zur Anzeige bringen wollen.
Listing 31.3 Einfache Abfrage
<?php $abfrage_main = "SELECT * FROM menue_main"; $ergebnis_main = mysql_query($abfrage_main); while($row_main = mysql_fetch_object($ergebnis_main)) { echo "$row_main->main_view<br>"; } mysql_free_result($ergebnis_main); ?>
Zweite Abfrage | Innerhalb der Schleife von Abfrage 1 (abfrage_ main) wird nun die zweite Abfrage, wie in Listing 31.4 zu sehen, eingefügt. In der WHERE-Bedingung steht als Wert die Variable $row_ main->main_ID.
Bei jedem Durchlauf der ersten Schleife wird dieser Wert auf den aktuellen Datensatzinhalt der ersten Abfrage (abfrage_main) gesetzt, und die zweite Abfrage (abfrage_main_sub) erhält aus der Tabelle »main_sub« alle Inhalte, die mit der Datensatz-ID der ersten Abfrage (abfrage_main) übereinstimmen.
Die Daten der zweiten Abfrage werden in diesem Fall nicht ausgegeben, sondern dienen nur wieder als Grundlage für die dritte Abfrage.
Listing 31.4 Verschachtelte Abfrage
<?php $abfrage_main = "SELECT * FROM menue_main"; $ergebnis_main = mysql_query($abfrage_main); while($row_main = mysql_fetch_object($ergebnis_main)) { echo "$row_main->main_view<br>"; $abfrage_main_sub = "SELECT * FROM main_sub WHERE main_ID=".$row_main->main_ID; $ergebnis_main_sub = mysql_query($abfrage_main_sub); while($row_main_sub =mysql_fetch_object($ergebnis_main_sub)) { // Platzhalter } } mysql_free_result($ergebnis_main); mysql_free_result($ergebnis_main_sub); ?>
Dritte Abfrage | In Listing 31.4 sehen Sie den Kommentar // Platzhalter. Dieser Platzhalter wird nun mit der dritten Abfrage in Listing 31.5 ersetzt. Diese Abfrage erhält wieder eine Variable aus der Abfrage 2 als Bedingung der WHERE-Anweisung ($row_main_sub->sub_ID).
Da in dieser Abfrage die Tabelle »menue_sub« ausgegeben wird, erhalten Sie als Datenrückgabe alle Datensätze dieser Tabelle, die über die Tabelle »main_sub« einem Hauptpunkt zugeordnet sind. Diese Daten werden auch angezeigt, da es sich um die Untermenüpunkte handelt. Am Ende der Schleifen werden die Daten wieder freigegeben.
Listing 31.5 Mehrfache Verschachtelung
<?php $abfrage_main = "SELECT * FROM menue_main"; $ergebnis_main = mysql_query($abfrage_main); while($row_main = mysql_fetch_object($ergebnis_main)) { echo "$row_main->main_view<br>"; $abfrage_main_sub = "SELECT * FROM main_sub WHERE main_ID=".$row_main->main_ID; $ergebnis_main_sub = mysql_query($abfrage_main_sub); while($row_main_sub = mysql_fetch_object($ergebnis_main_sub)) { $abfrage_sub = "SELECT * FROM menue_sub WHERE sub_ID=".$row_main_sub->sub_ID; $ergebnis_sub = mysql_query($abfrage_sub); while($row_sub = mysql_fetch_object ($ergebnis_sub)) { echo " $row_sub->sub_view<br>"; } } } mysql_free_result($ergebnis_main); mysql_free_result($ergebnis_sub); mysql_free_result($ergebnis_main_sub); ?>
Wenn Sie alles richtig angelegt haben, wird Ihnen nun in der Live Data-Ansicht unser »Menü« wie in Abbildung 31.14 angezeigt.
Abbildung 31.14 Ausgabe der Abfrage
Die Abfrage von Datenbanken mit verschachtelten Abfragen kommt häufig vor. Es lohnt sich daher, sich eingehend mit dieser Technik zu befassen.
Code strukturieren | |
An diesem Beispiel sehen Sie, wie wichtig es ist, den Quelltext übersichtlich und gut zu formatieren. Würden Sie den Code einfach »der Reihe nach« schreiben, fehlt jede Über- | sicht über die Zusammengehörigkeit einzelner Abfragen und Codeblöcke. Mit Einrückungen können Sie Funktionsgruppen einfach und strukturiert darstellen. |
31.1.3 Eine Volltextsuche
Auf fast jeder Website mit umfangreichen Inhalten ist eine Suchfunktion vorhanden. Gute und treffsichere Suchfunktionen zu programmieren ist schwer und variiert je nach den abzufragenden Inhalten stark. Für die meisten Websites reicht allerdings eine einfache Suche aus. Neben der Strukturierung der Datenbestände ist das Wiederauffinden der Daten eine der Hauptaufgaben beim Datenbankdesign.
SQL unterstützt freie Suchen durch diverse Befehle. Wichtig ist für uns nur LIKE in einer SQL-Abfrage. SQL-Abfragen können geschrieben werden wie folgt:
Listing 31.6 SQL-Suche
"SELECT * FROM `2_0` WHERE description LIKE '%$suchbegriff%'"
Der Inhalt von "$suchbegriff" ist eine Zeichenkette, nach der im Datensatz »description« der Tabelle »2_0« gesucht werden soll. Diese Variable wird aus einem Formular an das Ergebnisdokument übergeben.
Abbildung 31.15 Suchformular
Abbildung 31.16 Datensatzgruppe mit Suchabfrage
Da es häufig Probleme gibt, die GET-Arrays direkt in die SQL-Abfrage zu schreiben, wird am Beginn des Dokumentes folgende Codezeile eingefügt:
Listing 31.7 Zwischenvariable erstellen
$suche = $_GET['SUCHE'];
Die Variable aus dem GET-Array wird zunächst in der Variablen $suche zwischengespeichert. Die Abfrage wird dann mit dem Inhalt der Variablen $suche durchgeführt.
Die Datensatzgruppe wird im Bedienfeld Bindungen angezeigt, und Sie können wie immer die gewünschten Datenfelder in Ihr Dokument ziehen. Damit alle gefundenen Datensätze angezeigt werden, müssen Sie einen wiederholten Bereich mit den Einstellungen Alle Datensätze erstellen. Geben Sie durch Suchabfragen generierten Datensätzen eindeutige Bezeichnungen, um Verwechslungen mit »normalen« Abfragen zu vermeiden.
Abbildung 31.17 Datensatz in die Ergebnisseite einfügen
Suche über einen Index | MySQL bietet die Möglichkeit, von umfangreichen Datenbeständen einen Index zu erstellen und damit eine Suchanfrage zu starten. Lesen Sie dies bei Interesse in der MySQL-Dokumentation nach. Ob die Suche über einen Index tatsächlich schneller ist, entscheidet sich über die Menge und Struktur der Daten. Es kommt durchaus vor, dass eine indizierte Suche länger dauert als eine Suchanfrage ohne Indizes.