Praktikum im Grundstudium Teil 6: Dynamische Content-Generierung aus Datenbank-Daten als valid XHTML Aktueller Zustand Sie sollten schon in der Lage sein Formulare in XHTML zu erzeugen (statisch oder dynamisch), Formulare zu überprüfen (leere Felder, ) Ausgefüllte Formulardaten entgegenzunehmen und dem Nutzer anzuzeigen Formularwerte in die Datenbank zu speichern Formularwerte aus der Datenbank zu lesen Datenbankeinträge zu ändern Was fehlt? Diverse Kleinigkeiten Alle diese Dinge zusammenbringen Dynamische Generierung der Inhalte 1
Korrekter XHTML-Header Auslassung aus Foliensatz 1 Bekannt: Jedes XHML-Dokument sollte mit <html xmlns= beginnen Ausgelassen: DOCTYPE (für SGML-Konformität) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns= "http://www.w3.org/1999/xhtml"> </html> Ohne DOCTYPE Fehler bei W3C-HTML-Validator Der Lebenszyklus eines Formulars/Skripts Wie kann ein Formular so lange angezeigt werden, bis alle Eingaben korrekt sind? Ansatz bei interaktiven Programmen á la GdI 1: Schleife um Lesen der Eingabe Schleife wird verlassen, wenn die Eingabe korrekt ist $iscorrect = false while (!$iscorrect) { Lesen der Eingabe Prüfen der Eingabe Setzen von $iscorrect = true bei vollständiger Eingabe Funktioniert bei Web-Anwendungen leider nicht! Grund: Mit jedem Browser-Aufruf wird das Skript neu ausgewertet 2
Der Lebenszyklus eines Formulars/Skripts Lösung Skript hat sich selbst als action= Bei Aufruf: Auswerten der Parameter Ohne Parameter = Aufruf kam zum ersten Mal Mit Parameter Überprüfen der Parameter auf Gültigkeit Markieren der ungültigen Elemente Der Lebenszyklus eines Formulars/Skripts Beispiel <html> <head><title>test</title></head> <body> <form action="form.php"> <?php if ($_REQUEST["hallo"] == '') echo '<p style="color: red">'; else echo '<p>'; echo 'Hallo: <input type="text" name="hallo" value="'; echo $_REQUEST["hallo"]; echo '" /></p>';?> </form> </body> </html> 3
Der Lebenszyklus eines Formulars/Skripts http://.../form.php Browser Eingabe Browser Sendet Anfrage form.php ohne Parameter Ergebnis von form.php ohne Parameter Sendet Anfrage form.php Parameter: Ausgefüllter Wert Webserver Webserver ergänzt Browser Ergebnis von form.php mit Parameter Sendet Anfrage form.php Parameter: Versteckte Elemente Wiederholung aus Foliensatz 3: Versteckte Elemente Werden nicht angezeigt Können nicht verändert werden Werden aber an Server übertragen User-ID in verstecktem Element speichern, bei Übermittlung des Formulars passenden Benutzer suchen Definition <input type="hidden" name="id value= Wert" /> Sehr praktisch für die Überprüfung Wird das Formular zum ersten mal angezeigt? Keine Fehlermarkierung Verstecktes Element nicht vorhanden: erste Anzeige if ($_REQUEST["id"]!= "Wert")... 4
Modularisierung Durch den include-befehl können Seiten in Module aufgeteilt werden include($dateiname); Wertet das als Dateiname gegebene PHP-Skript aus Zeigt das Ergebnis des Skripts an der Stelle des include- Befehls an Verwendung: Einzelne Vorlage-Dateien für verschiedene Bereiche der Seite Datei mit Hilfsfunktionen, die oft benötigt werden Umleitung auf andere URLs Umleitung auf neue URL häufig sinnvoll Umzug in anderes Verzeichnis/auf andere Server merkbare URL wird in computerlesbare URL umgewandelt Formular korrekt eingegeben neue Anzeige, obwohl action= das Formular als URL definiert http://.../form.php http://.../done.php Browser vollständige Eingabe Browser Neue/falsche Eingabe 5
Umleitung auf andere URLs PHP-Funktion für Umleitung function goto($location) { header('location: http://'.$_server['http_host']. dirname($_server['php_self']).'/'.$location); Kandidat für Datei mit Hilfsfunktionen Umleitung muss vor der Ausgabe von Daten passieren! noch vor XHTML-Header Verwendung <?php include("util.php"); if (eingabekorrekt()) { Speichern der Werte in die Datenbank goto("done.php");?> <html> Ausblick: Template Engines Validierung von Eingabedaten häufigste Anwendung von Skripts Durch Web-Lebenszyklus etwas unpraktisch Vorgestellte Techniken reichen für Praktikum aus Template Engines Fertige Lösungen für automatische Erzeugung von dynamischen Seiten Trennen Skript und Layout einfacher für Nichtprogrammierer (?) z.b.: Smarty - http://smarty.php.net/ Beispiele auf Webseite Einsatz im Praktikum erlaubt, aber nicht verpflichtend 6
Aus Datenbank erstellter Content Never do what SQL can do for you Verwenden von WHERE- und HAVING-Klauseln, anstelle Daten in PHP zu prüfen Sortierung mittels ORDER gewährleisten Verwenden von LIMIT bei Anzeige nicht-vollständiger Anzeige Ergebnisse 1-10 von ungefähr 241,000,000 Dynamisches Generieren von SQL-Statements SQL-Statements sind normale Strings können nach Belieben zur Laufzeit erstellt werden Aus Foliensatz 5: Vorsicht vor Böswilligen Abfragen bei SQL-Abfragefeldern Entschärfen der Eingabe mit addslashes sorgt dafür, dass aus WHERE nicht zwei Abfragen werden Bei Syntaxfehlern in dynamisch generierten Statements Fehlermeldung von PHP Unterdrückung mittels @ vor mysql_query Zum Entwickeln Anzeige der Fehlermeldung sinnvoll 7
Dynamisches Generieren von SQL-Statements Beispiel: Einfache Suche in einem Feld... <form action="search.php"> Name: <input name="query" type="text" /> </form> <?php if ($_REQUEST['query']!= '') { $result = @mysql_query("select * FROM users WHERE ". name = '". addslashes($_request['query']. "'");?>... while ($person = @mysql_fetch_array($result)) { // Ausgabe Verwenden von XHTML-Features für automatische SQL-Erstellung Gegeben: Datenbank mit vordefinierten Feldern Gesucht: Deutsches Formular, soll Sortierung nach Belieben erlauben <form action="sort.php"> Sortierung nach: <select name="order" size="1"> <option value="firstname">vorname</option> <option value="lastname">nachname</option> <option value="company">firmenname</option> </select> </form> FirstName LastName Company <?php $order = _REQUEST['order']; if ($order == '') $order = 'FirstName'; $result = @mysql_query("select * FROM users ORDER BY $order");?> 8
Automatisches Erstellen komplexer SQL-Anfragen Suche mit mehreren optionalen Elementen SQL-Anfrage muss zu suchende Felder in WHERE mit AND verbinden Syntax-Einschränkung: AND nur zwischen Feldern erlaubt, nicht am Anfang oder Ende Automatisches Erstellen komplexer SQL-Anfragen Mehrere Möglichkeiten für korrekte Syntax Testen, ob noch Nachfolger vorhanden ist wenn ja, dann AND hinzufügen Einfacher mit Trick: AND immer hinzufügen Am Ende immer 1 hinzufügen Ergebnis: SELECT WHERE foo = 'x' AND bar = 'y' AND 1 9
Automatisches Erstellen komplexer SQL-Anfragen function makequery() { $query = 'SELECT * FROM publications WHERE '; $fields = array('author', 'project', 'year'); foreach ($fields as $element) { if ($_REQUEST[$element]!= '') $query.= "$element = '". addslashes($_request[$element]). "' AND "; if ($_REQUEST['search']) { $query.= "(keyword LIKE '%". addslashes($_request['search']). "%' OR abtract LIKE '%". addslashes($_request['search']). "%') AND "; $query.= "1"; return $query; Beispiel Automatisches Erstellen komplexer SQL-Anfragen Guido Rößling algorithmen SQL-String 'SELECT * FROM publications WHERE author='guido Rößling' AND (keyword LIKE '%algorithmen%' OR abstract LIKE '%algorithmen%') AND 1 10
Projekt Erstellen einer Mediendatenbank In Ausbaustufen unterteilt Ausbaustufen bauen aufeinander auf Sind in sich abgeschlossen Erzielte Ausbaustufe bestimmt bestenfalls erreichbare Note Abnahme Kurze Dokumentation des Projekts Testat der Lehrveranstaltungsleiter in der letzten Vorlesungswoche 11