52
Dynamische Webseiten (CGI) mit Perl Teile der Präsentation von A. Grupp, [email protected]

Dynamische Webseiten (CGI) mit Perl

  • Upload
    kimama

  • View
    48

  • Download
    4

Embed Size (px)

DESCRIPTION

Dynamische Webseiten (CGI) mit Perl. Teile der Präsentation von A. Grupp, [email protected]. Planung der Inhalte?. Ein Perl-Crashkurs Eine Einführung in die Welt der Protokolle anhand http Eine Einführung in das Common Gateway Interface - PowerPoint PPT Presentation

Citation preview

Page 1: Dynamische Webseiten (CGI)  mit Perl

Dynamische Webseiten (CGI) mit Perl

Teile der Präsentation von A. Grupp, [email protected]

Page 2: Dynamische Webseiten (CGI)  mit Perl

Planung der Inhalte?

Ein Perl-Crashkurs

Eine Einführung in die Welt der Protokolle anhand http

Eine Einführung in das Common Gateway Interface

Entwicklung webbasierender Applikationen mit Datenbankanbindung (SQL-Server)

Page 3: Dynamische Webseiten (CGI)  mit Perl

Dynamisch? CGI? Sonst noch was?

Page 4: Dynamische Webseiten (CGI)  mit Perl

Verwendete Software

Linux als Serverbetriebssystem Apache-Webserver als Serverprogramm (httpd) Texteditor ftp-Client (WS_FTP-LE) Browser (MSIE od. Netscape) Standard-Perl-Interpreter Apache-Servererweiterung mod_perl MySQL-Datenbankserver

Page 5: Dynamische Webseiten (CGI)  mit Perl

HTML ohne Perl!

Der Browser nimmt die URL in der Adressleiste entgegen und leitet sie in Form einer http-Anfrage an den Webserver

(httpd) weiter. Dabei sprechen beide die Sprache "http"! Der Server stellt die gewünschte Information zusammen und

leitet sie wieder auf "http-ianisch" an den Browser zurück.

Page 6: Dynamische Webseiten (CGI)  mit Perl

HTML mit Perl (CGI) Die Anfrage geht nicht an eine statische Datei Es wird vielmehr über den httpd ein Programm aufgerufen Dieses erzeugt dynamisch Daten (z.B. HTML) Die "frisch" erzeugten Daten gehen über den httpd an den

Anfragenden zurück

Page 7: Dynamische Webseiten (CGI)  mit Perl

HTML-File zum Aufruf des CGI-Programms „world.pl“

<html><body bgcolor="#ffffff" text="#000000"> <h1>Hello world</h1> Ein Klick auf den grauen Knopf listet das<br> CGI-Programm world.pl auf.<br><p> <form action="cgi-bin/world.pl" method="post"> <input type="submit" value="Programm aufrufen"> </form></body></html>

Page 8: Dynamische Webseiten (CGI)  mit Perl

CGI-Programm „world.pl“

Ein Problem ist allerdings dass der httpd im Gegensatz zu *.html- oder *.gif-Dateien keine Ahnung hat welche Art von Daten das CGI-Skript produziert.

Diese Information (letzte Zeile des http-Headers) muß deshalb vom CGI-Skript über den Content-Type selbst geliefert werden.

#!/usr/bin/perl -wuse strict;print "Content-type: text/html\n";print "\n";print "<html><head><title>Hello world</title>";print "</head><body>";print "<h1>Willkommen beim CGI-Programm</h1>\n\n";print "<h1>Hello world</h1>\n";print "</body></html>";

Page 9: Dynamische Webseiten (CGI)  mit Perl

Umgebungsvariablen

Ein installierter Webserver stellt eine bestimmte Anzahl von CGI-Umgebungsvariablen zur Verfügung, denen vom System bei jedem Aufruf eines CGI-Programms gewisse Werte zugewiesen werden.

Andererseits kann auch ein CGI-Programm diesen Variablen Werte zuweisen, die dann innerhalb des CGI-Programms verwendet werden können.

CGI-Umgebungsvariablen existieren immer und sind vollständig unabhängig von anderen selbstdefinierten Variablen.Zugriff auf die Umgebungsvariablen in Perl:

print $env(‘Name_der_Umgebungsvariablen‘)

Page 10: Dynamische Webseiten (CGI)  mit Perl

Umgebungsvariable - CONTENT_LENGTH

In der Variablen CONTENT_LENGTH wird die Anzahl der Zeichen gespeichert, die beim Aufruf des CGI-Programms über die Methode post übergeben wurden.

HTML-Dokument mit CGI - Aufruf:

<html><head><title>Umgebungsvariable - CONTENT_LENGTH</title></head><body><h1>Testformular</h1><form action=„cgi-bin/test.pl“ method=post>Name: <input size=40 maxlength=40 name=“AnwenderName“><br>Text: <textarea rows=% cols=70 name=„Kommentartext“ wrap=virtual></textarea><p><input type=submit value=“Absenden“></form></body></html>

Page 11: Dynamische Webseiten (CGI)  mit Perl

Umgebungsvariable - CONTENT_LENGTH

CGI-Skript test.pl mit HTML-Ausgabe

#!/usr/bin/perl read(STDIN, $DATEN, $ENV{‘CONTENT_LENGTH‘});print “CONTENT-type: text/html\n\n“;print “<html><head><title>CGI-Reaktion</title></head>\n“;print „<body><h1>Reaktion des CGI-Programms</h1>\n“;print $env{‘CONTENT_LENGTH‘};print “</body></html>\n“;

Page 12: Dynamische Webseiten (CGI)  mit Perl

Weiter Umgebungsvariablen

CONTENT_TYPE # gibt Auskunft über den verwendeten MIME-TypGATEWAY_INTERFACE # Versionsnummer der unterstützten CGI-SchnittstelleHTTP_ACCEPT # Liste der MIME-Typen (Dateitypen), welche der Browser

# verarbeiten kannHTTP_REFERER # URL-Adresse von der aus das CGI-Skript aufgerufen wurdeHTTP_USER_AGENT # Informationen über den BrowserQUERY_STRING # Wird ein HTML-Formular von einem Anwender ausgefüllt

und abgesendet, so stehen in der Umgebungsvariablen QUERY_STRING die ausgefüllten Formulardaten

REMOTE_HOST # Domain-Adresse des Server-RechnersREQUEST_METHOD # Versandmethode post oder getSCRIPT_NAME # URL-Adresse des CGI-SkriptsSERVER_NAME # Name oder IP-Adresse des ServersSERVER_PORT # Portnummer des WebServersSERVER_SOFTWARE # Produktsoftware des WebServes

Page 13: Dynamische Webseiten (CGI)  mit Perl

Übungsaufgabe

Erstellen Sie analog der Umgebungsvariablen CONTENT_LENGTH, das entsprechende HTML-Formular bzw. Perl-Skript zur Ausgabe verschiedener Umgebungsvariablen.

Page 14: Dynamische Webseiten (CGI)  mit Perl

HTML-Formular zur Ausgabeverschiedener Umgebungsvariablen

<html><body bgcolor="#ffffff" text="#000000"> <h1>Umgebungsvariablen</h1> Ein Klick auf den grauen Knopf listet alle<br> Umgebungsvariablen unseres lokalen Webservers<br> auf. Die Installation und Einrichtung wurde<br> bereits in Teil I dieses Buches besprochen.<p> <form action="cgi-bin/env.pl" method="post"> <input type="submit" value="ENV auflisten"> </form></body></html>

Page 15: Dynamische Webseiten (CGI)  mit Perl

#!/usr/bin/perl

# Bei Apache unter Windows #!c:/Perl/bin/perl.exe

# Art der Datenprint "Content-Type: text/html\n\n";

# Seitenbeginn und Tabelleprint "<html>\n<body>\n";print "<table>\n";print "<tr>\n<th>Schlüssel</th>\n";print "<th>Wert</th>\n</tr>\n";

# die einzelnen Wertepaarewhile(@array=each(%ENV)){ # Tabellenzeile print "<tr>\n<td>"; print "$array[0]</td>\n<td>"; print "$array[1]</td>\n</tr>\n";}

# Seitenendeprint "</table>\n</body>\n</html>";

Eine mögliche Lösung zum env.pl

Page 16: Dynamische Webseiten (CGI)  mit Perl

Formulare in HTML (1)

Page 17: Dynamische Webseiten (CGI)  mit Perl

Formulare in HTML (2)...<form action=“cgi-bin/test.pl" method="get"> <p>Nachname:<input type="text" name="nname"></p> <p>Vorname:<input type="text" name="vname"></p> <p><input type=reset value="Kommando zur&uuml;ck"></p> <p><input type=submit value="Haben fertig ..."></p></form>...

Jedes Formular-Element ist mit einem "Namen" versehen

Der "type" legt die Art des Formularelements fest

Page 18: Dynamische Webseiten (CGI)  mit Perl

Formulare in HTML (3)...<form action=“cgi-bin/test.pl" method="get"> <p>Nachname:<input type="text" name="nname"></p> <p>Vorname:<input type="text" name="vname"></p> <p><input type=reset value="Kommando zur&uuml;ck"></p> <p><input type=submit value="Haben fertig ..."></p></form>...

Der "action"-Parameter des <form>-Tags legt fest welche URL für die Verarbeitung der Formulardaten zuständig ist wenn die "submit"-Schaltfläche gedrückt wird.

Page 19: Dynamische Webseiten (CGI)  mit Perl

Formulare in HTML (4)

Bei Verwendung der "get"-Methode werden die Formulardaten einfach an den URL angehängt:

? &

test.pl nname=Muster

vname=Hugo

http://<server>/<akt.-Verz.>/test.pl?nname=Muster&vname=Hugo

Page 20: Dynamische Webseiten (CGI)  mit Perl

http://<server>/<akt.-Verz.>/test.pl?nname=Muster&vname=Hugo

Der httpd und die Formulardaten

Der Webserver erkennt nun anhand des Fragezeichens im URL den für ihn relevanten Teil. Er trennt den Anhang - unseren Planwagentreck - ab und stellt diesen dem CGI-Skript als Inhalt der Umgebungsvariablen QUERY_STRING zur Verfügung.

http://<server>/<akt.-Verz.>/test.pl

QUERY_STRING = nname=Muster&vname=Hugo

Der URL für den httpd:

Der Inhalt dieser Umgebungsvariablen ist unsern CGI-Skripten über $ENV{'QUERY_STRING'} zugänglich und kann nun weiterverarbeitet werden.

Page 21: Dynamische Webseiten (CGI)  mit Perl

nname=Meier&vname=Hans&ort=Tettnang

Verarbeitung des QUERY_STRING's

( )

& &

' ''', '',

Zum Zerlegen der Zeichenkette wird die Funktion split() verwendet

split(/&/, $ENV{'QUERY_STRING'}

Das Ergebnis der split()-Funktion ist somit ein "anonymes" Feld

Page 22: Dynamische Webseiten (CGI)  mit Perl

nname=Meier&vname=Hans&ort=Tettnang

Verarbeitung des QUERY_STRING's

Zum Zerlegen der Zeichenkette wird die Funktion split() verwendet

( )' ''', '',

Dieses anonyme Feld wird nun in einem benannten Feld (z.B @formulardaten) abgespeichert:

@formulardaten = split(/&/, $ENV{'QUERY_STRING'}

$formulardaten[0]

$formulardaten[1]

$formulardaten[2]

nname=Meiervname=Hans

ort=Tettnang

Page 23: Dynamische Webseiten (CGI)  mit Perl

nname=Meier&vname=Hans&ort=Tettnang

Verarbeitung des QUERY_STRING's

Zum Zerlegen der Zeichenkette wird die Funktion split() verwendet

( )' ''', '',

Dieses anonyme Feld wird nun in einem benannten Feld (z.B @formulardaten) abgespeichert:

@formulardaten = split(/&/, $ENV{'QUERY_STRING'}

$formulardaten[0]

$formulardaten[1]

$formulardaten[2]

nname=Meiervname=Hans

ort=Tettnang

Page 24: Dynamische Webseiten (CGI)  mit Perl

Das CGI-Skript im Überblick

#!/usr/bin/perl -w

use strict;my (@formulardaten, $formfeld, $name, $wert, %feld);

@formulardaten = split(/&/, $ENV{'QUERY_STRING'});foreach $formfeld (@formulardaten){ ($name, $wert) = split(/=/, $formfeld); $feld{$name} = $wert;}

print "Content-Type: text/html\n\n";print "<html><head><title>Hallo</title></head>";print "<body><h1>" . "Hallo $feld{'vname'} $feld{'nname'}" . "</h1></body></html>";

Page 25: Dynamische Webseiten (CGI)  mit Perl

<html><head><title>Formulartest CGI</title></head><body><p>Bitte geben Sie Ihren Namen ein:</p><form method="get" action=“cgi-bin/test.pl"> <table><tr> <td>Nachname:</td> <td><input type="text" size="20" name="nname"></td> </tr><tr> <td>Vorname:</td> <td><input type="text" size="20" name="vname"></td> </tr> </table> <p><input type="submit" value="Absenden"></p></form></body></html>

Das Formular im Überblick

Page 26: Dynamische Webseiten (CGI)  mit Perl

Nächste Übungsaufgabe! Erstellen Sie ein HTML-Formular mit vier Eingabefeldern zur Erfassung des

Vornamen, Nachnamen, Strasse und Wohnort von Personen

Programmieren Sie ein Perl-CGI-Skript zur Verarbeitung der Formulardaten. Das Skript gibt beispielsweise nach Eingabe von:

Nachname: MustermannVorname: Franz

Strasse: Hauptstr.16Wohnort: Ulm

im Browser das Feedback

Hallo Franz Mustermann!Sie wohnen in der Hauptstr.16 in Ulm

zurück.

Page 27: Dynamische Webseiten (CGI)  mit Perl

MIME-Codierung im URL (I) In einem URL dürfen nur druckbare Zeichen aus dem

Standard-ASCII-Zeichensatz (0-127) auftreten. Insbesondere nationale Sonderzeichen (z.B. äöüßÄÖÜßàá) sind verboten.

Auch Leerzeichen können in einem URL nicht auftreten.

Diverse Zeichen wie beispielsweise %+&= sind bereits für andere Aufgaben vorgesehen und können ebenfalls so nicht direkt auftauchen.

Für all diese Zeichen gibt es deshalb eine andere Darstellungsform entsprechend dem

RFC2396 "Uniform Resource Identifiers (URI): Generic Syntax".

Page 28: Dynamische Webseiten (CGI)  mit Perl

MIME-Codierung im URL (II)

Ein Leerzeichen wird deshalb zu einem '+'

Nationale Sonderzeichen werden durch ihre hexadezimale Darstellung entsprechend ASCII-Zeichensatz dargestellt. Zur Erkennung dieser Hex-Zeichen wird ein "%" vorangestellt.

Damit ergibt sich beispielsweise für den Buchstaben "Ö" innerhalb eines URL's die Kodierung "%D6".

Aus "Karl Österle" wird damit "Karl+%D6sterle"

Page 29: Dynamische Webseiten (CGI)  mit Perl

MIME-Codierung im URL (III)Ein möglicher Code zur Rücktransformation dieser Darstellung sieht folgendermaßen aus:

$wert =~ tr/+/ /;$wert =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg;

Mittels der translate-Operation "tr//" werden alle "+" Zeichen in ein Leerzeichen umgewandelt.

Die substitute-Operation "s//" sucht zuerst nach dem Suchmuster "%hexhex" und merkt sich dabei die beiden gefundenen Hex-Zeichen in der Perl-Variablen $1 (das "Merken" wird dabei duch die beiden runden Klammern bewerkstelligt).

Mittels hex() wird $1 dann in eine Binärzahl und diese wiederum durch pack() in ein Zeichen umgewandelt.

Page 30: Dynamische Webseiten (CGI)  mit Perl

#!/usr/bin/perl -w

use strict;my (@formulardaten, $formfeld, $name, $wert, %feld);

@formulardaten = split(/&/, $ENV{'QUERY_STRING'});foreach $formfeld (@formulardaten){ ($name, $wert) = split(/=/, $formfeld); $wert =~ tr/+/ /; $wert =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $feld{$name} = $wert;}

print "Content-Type: text/html\n\n";print "<html><head><title>Hallo</title></head>";print "<body><h1>" . "Hallo $feld{'vname'} $feld{'nname'}" . "</h1></body></html>";

MIME-Codierung im URL (IV)

Page 31: Dynamische Webseiten (CGI)  mit Perl

Datentransfer mit POST -Request (I) Größere Datenmengen (lange Texte, Dateiuploads, ...) können nicht

mehr an den URL angehängt werden

In solchen Fällen werden die Daten im Datenbereich eines http-POST-Requests übertragen.

POST /cgi-bin/test.pl HTTP/1.1Host: www.nowhere.comContent-Length: 23

nname=Muster&vname=Hugo

Page 32: Dynamische Webseiten (CGI)  mit Perl

Datentransfer mit POST -Request (II) Die Daten eines POST-Requests stehen uns nun leider nicht mehr

in der Umgebungsvariablen QUERY_STRING zur Verfügung.

Es müssen stattdessen die richtige Anzahl an Zeichen (Wert steht in der Umgebungsvariablen CONTENT_LENGTH) von der Standardeingabe eingelesen werden.

read(STDIN, $daten, $ENV{'CONTENT_LENGTH'});

Die Daten die ursprünglich in der Umgebungsvariablen QUERY_STRING zur Verfügung standen sind nun im Skalar $daten enthalten. Das Format hat sich dabei nicht geändert!

Page 33: Dynamische Webseiten (CGI)  mit Perl

Datentransfer mit POST -Request (III) Über die Umgebungsvariable REQUEST_METHOD kann ein Skript

sogar feststellen welche Methode im Formular verwendet wurde.

Damit ist ein universelles Einlesen der Formulardaten möglich:

if($ENV{'REQUEST_METHOD'} eq 'GET'){ $daten = $ENV{'QUERY_STRING'};}else{ read(STDIN, $daten, $ENV{'CONTENT_LENGTH'});}@formulardaten = split(/&/, $daten);

Page 34: Dynamische Webseiten (CGI)  mit Perl

#!/usr/bin/perl -w

use strict;my (@formulardaten, $formfeld, $name, $wert, $daten, %feld);

if($ENV{'REQUEST_METHOD'} eq 'GET'){ $daten = $ENV{'QUERY_STRING'}; }else{ read(STDIN, $daten, $ENV{'CONTENT_LENGTH'});}@formulardaten = split(/&/, $daten);

@formulardaten = split(/&/, $ENV{'QUERY_STRING'});foreach $formfeld (@formulardaten){ ($name, $wert) = split(/=/, $formfeld); $wert =~ tr/+/ /; $wert =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg; $feld{$name} = $wert;}

print "Content-Type: text/html\n\n";print "<html><head><title>Hallo</title></head>";print "<body><h1>Hallo $feld{'vname'} $feld{'nname'}". "</h1></body></html>";

Formular fertig !!!

Page 35: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (I)

- Erstellen Sie in ACCESS eine Datenbank mit zwei Tabellen und je drei Spalten.- Jede Tabelle benötigt einen eindeutigen Schlüssel (key), der die einzelnen Datensätze identifiziert.

Tabelle Adressen:Adressenlisten-Nr (key)Vorname Nachname1 Walter Müller2 Frank Testmann3 Tester Testmensch4 Willi Wuff5 Robert Mustermayer

RechnungsNr (key) Adressenlisten-Nr Artikelname1 1 Eis2 1 Butter3 3 Eis4 2 Salat5 2 Margarine

Tabelle Rechnungen- Hier wird gespeichert , welche Person welche Artikel gekauft hat.

- Datenbank speichern unter C:\perltest\testdb.mdb

Page 36: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (II) - ODBC

- Um die Datenbank von Perl aus ansprechen zu können, muss diese dem Betriebssystem zugänglich gemacht werden.- ODBC-Manager (Open Database Connectivity) - Zugriff auf eine Datenbank ohne das zugehörige Programm

Konfiguration des ODBC - Managers:- Systemsteuerung / ODBC-Datenquellen (32bit) / System DNS

- Hinzufügen / Microsoft Access-Treiber (*.mdb)- Fertigstellen

- Weitere Informationen: - Datenquellenname (Name mit dem wir die Datenbank mit Perl über ODBC später ansprechen). Beispiel: Testdatenbank.- Beschreibung- Datenbank(Auswählen / C:\perltest\testdb.mdb)

- Zugriff auf die ACCESS - Datenbank- Abfragen starten- Daten hinzufügen - Daten löschen

Page 37: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (III) - SQL

Ziel: Wir möchten wissen, welche Artikel Walter Müller gekauft hat?Weg: Abfrage erstellen.SQL: Abfragen werden mit einer eigenen Sprache für Datenbanken, SQL, geschrieben und können jeder Datenbank gestellt werden. Ob wir hier also ACCESS, Oracle oder MySQL verwenden, spielt für die Abfrage keine Rolle.

Grundgerüst einer Abfrage :SELECT werte FROM tabellen WHERE bedingungen;Einfachste Form einer Abfrage:SELECT * FROM Adressen;

Lösung:SELECT Rechnungen.ArtikelnameFROM Adressen, RechnungenWhere Adressen.Vorname=Walter AND Adressen.Nachname=Müller ANDAdressen.AdressenlistenNr=Rechnungen.AdressenlistenNr;

Anmerkung:Da die Felder Vorname und Nachname eventuell in mehreren Tabellen vorkommenm, muss bei der Verwendung mehrerer Tabellen für die Suche vor alle Felder immer der Name der zugehörigen Tabelle geschrieben werden. Als Trennzeichen dient ein Punkt. Die Verknüpfung zwischen den beiden unabhängigen Tabellen erfolgt nun über den Schlüssel AdressenlistenNr. Dieser muss in beiden Tabellen vorhanden und identisch sein.

Page 38: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (IV) - Win32::ODBC

Win32::ODBC: Reines Windows Objekt bzw. Klasse. Beinhaltet alle erforderlichen Funktionen für den Umgang mit einer Datenbank. Methoden repräsentieren die Fähigkeiten eines jeden Objektes. Eine Methode wird immer mit der Pfeilnotation aufgerufen.: Bsp: $auto ->geschwindigkeit();

Beispiel 1 (Erste Verbindung mit der Datenbank): #!/usr/bin/perluse Win32::ODBC;$dsn = "Testdatenbank"; # Variable dsn speichert den Namen unserer Datenbank### TEIL Iif($db = Win32::ODBC ->new($dsn)) # Aufruf der Methode new. { print "Verbindung zu $dsn hergestellt.\n";}else{ print "Verbindung zu $dsn fehlgeschlagen!\n"; print "Fehler: " . Win32::ODBC::Error() . "\n"; exit;}### TEIL II$db->Close();

Page 39: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (V) - Abfragen

Beispiel 2 (Einfache Ausgabe aller Personen aus der Tabelle Adressen!): #!/usr/bin/perluse Win32::ODBC;$dsn="Testdatenbank";### TEIL Iif(!($db = Win32::ODBC ->new($dsn))) # Entfernung des else Teils. Anstelle einer Erfolgsmeldung wird ein{ # Abfrage Ergebnis ausgegeben! print "Verbindung zu $dsn fehlgeschlagen!\n"; print "Fehler: " . Win32::ODBC::Error() . "\n"; exit;}### TEIL II # Else Teil (Abfrage Ergebnis) beginnt bei erfolgreichem DB-connect!$sql = "SELECT * FROM Adressen"; # Definition der SQL-Abfrage in der Variablen $sql### TEIL IIIif(!($db->Sql($sql))) # Durchführung der eigentlichen Abfrage durch den Aufruf der Methode SQL(){ # die als Parameter die zuvor gespeicherte Abfrage $sql erhält. print "Fehler bei SQL-Abfrage!\n"; # Liefert die Abfrage keinen Rückgabewert beginnt Teil IV ansonsten Fehler- print "Fehler: ".$db->Error()."\n"; # meldung! $db->Close(); exit;}### TEIL IV # Ergebnis - Ausgabe in einer mehrspaltigen Tabelle. Für die Ausgabe wird nunwhile($db->FetchRow()) # jede Zeile mit Hilfe der Methoden FetchRow() und DataHash() in ein Hash{ # gespeichert. FetchRow () liefert immer eine ganze Zeile, DataHash() %hash = $db->DataHash(); # zerlegt diese Zeile in einzelne Hash-Elemente. print "\n".$hash{"AdressenlistenNr"}; # Dieser Vorgang wird innerhalb einer while-Schleife solange wiederholt, bis print " ".$hash{"Vorname"}; # alle Zeilen der Ergebnis-Tabelle ausgegeben worden sind. Ist keine weitere print " ".$hash{"Nachname"}; # Zeile mehr vorhanden, liefert FetchRow() einen unwahren Rückgabewert} # und die Schleife wird beendet.print "\n";### TEIL V # Verbindung zur Datenbank wird getrennt$db->Close();

Page 40: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (VI) - Abfragen

Beispiel 3 (Ausgabe aller Artikelnamen die von Walter oder Willie gekauft wurden) #!/usr/bin/perluse Win32::ODBC;$dsn="Testdatenbank";### TEIL Iif(!($db=Win32::ODBC->new($dsn))){ print "Verbindung zu $dsn fehlgeschlagen!\n"; print "Fehler: " . Win32::ODBC::Error() . "\n"; exit;}### TEIL II$sql = "SELECT Adressen.Vorname,Rechnungen.Artikelname FROM Adressen,Rechnungen WHERE Adressen.AdressenlistenNr=Rechnungen.AdressenlistenNr AND (Adressen.Vorname='Walter'OR Adressen.Vorname='Willie')";### TEIL IIIif($db->Sql($sql)){ print "Fehler bei SQL-Abfrage!\n"; print "Fehler: ".$db->Error()."\n"; $db->Close(); exit;}### TEIL IVwhile($db->FetchRow()){ %hash = $db->DataHash(); print "\n".$hash{"Artikelname"}; print " (".$hash{"Vorname"}.")";}print "\n";### TEIL V$db->Close();

Page 41: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (VII) - Datensatz einfügen

Beispiel 4 (Einfügen eines neuen Datensatzes) #!/usr/bin/perluse Win32::ODBC;$dsn="Testdatenbank";### TEIL Iif(!($db=Win32::ODBC->new($dsn))){ print "Verbindung zu $dsn fehlgeschlagen!\n"; print "Fehler: " . Win32::ODBC::Error() . "\n"; exit;}### TEIL II$sql = "INSERT INTO Adressen (Vorname,Nachname) VALUES ('Max','Mayer')";### TEIL IIIif($db->Sql($sql)){ print "Fehler bei SQL-Abfrage!\n"; print "Fehler: ".$db->Error()."\n"; $db->Close(); exit;}print "Ein Datensatz hinzugefügt.\n";### TEIL IV$db->Close();

Page 42: Dynamische Webseiten (CGI)  mit Perl

Datenbank-Anbindung unter Windows (VIII) - Datensatz entfernenBeispiel 5 (Entfernen eines Datensatzes) #!/usr/bin/perluse Win32::ODBC;$dsn="Testdatenbank";### TEIL Iif(!($db=Win32::ODBC->new($dsn))){ print "Verbindung zu $dsn fehlgeschlagen!\n"; print "Fehler: " . Win32::ODBC::Error() . "\n"; exit;}### TEIL II$sql = "DELETE * FROM Adressen WHERE Vorname LIKE 'W%'";### TEIL IIIif($db->Sql($sql)){ print "Fehler bei SQL-Abfrage!\n"; print "Fehler: ".$db->Error()."\n"; $db->Close(); exit;}print "Datensatz (-saetze) entfernt.\n";### TEIL IV$db->Close();

Page 43: Dynamische Webseiten (CGI)  mit Perl

MySQL Datenbank-Anbindung mit Perl - DBI / DBD

- Ähnlich wie ODBC, das Zugriff auf jede Datenbank unter Windows ermöglicht- ermöglicht DBI , das sog. Perl Datenbank Interface den Datenbankzugriff auf MySQL-Datenbanken- dabei kommuniziert das Interface mit einem Datenbank Treiber, dem DBD.

Installation der Perl DBI und der MySQL DBDPerl besteht aus einer Reihe von Modulen. Jedes Modul erweitert die Fähigkeiten von MySQL. Es sind eine große Menge von Modulen für Perl verfügbar.

Unter Windows:Nachdem sie Perl installiert haben, wechseln sie in das Perl - Verzeichnis. Hier finden Sie ein Unterverzeichnis namens bin. Suchen Sie nach dem PPM-Programm (Perl Package Manager), dieses kleine Programm findet Perl Module im Internet, lädt diese auf die lokale Festplatte und installiert sie automatisch. Um die DBI zu installieren, doppelklicken sie auf die PPM-Datei. Daraufhin öffnet sich ein DOS-Fenster. Stellen Sie eine Verbindung mit dem Internet her und geben sie folgendes ein:PPM> install DBI #Installation des DBI-Interface beginnt.Nach erfolgreicher Installation können sie den DBD-Treiber installieren:PPM> install DBD-MySQL

Page 44: Dynamische Webseiten (CGI)  mit Perl

MySQL Datenbank-Anbindung mit Perl - DBI / DBD

Unter Linux:1. Downloaden Sie das DBI sowie das DBD von der MySQL-Webseite (www.mysql.com) und kopieren Sie sie in das Verzeichnis /home/perl2. Entpacken Sie die DBI-Datei3. Nach dem erfolgreichen Entpacken können Sie die Datei kompilieren. Wechseln Sie hierfür in das neu erstellte DBI-1.11 Verzeichnis.4. Erstellen Sie die make-Datei:shell> perl Makefile.pl5. Einfügen des Moduls in die richtigen Verzeichnisse:shell> make # Einige Daten fliegen über den Bildschirmshell>make test # Bildschirm füllt sich erneut mit einer Menge Datenshell> make install # Erfolgreiches Installieren des Perl DBI ?!?

6. Entpacken Sie die DBD-Datei, wie sie es auch mit der DBI-Datei gemacht haben, ändern Sie lediglich den Dateinamen.7. Nach dem Entpacken geben sie folgende Anweisung ein:shell> perl Makefile.pl8. Sie sollten nun mit 5 verschiedenen Auswahlmöglichkeiten konfrontiert sein. Wählen Sie folgende Möglichkeit: MySQL and mSQL (either of mSQL 1 or mSQL 2)# mSQL ist ein früher Vorgänger von MySQL9. Beantworten Sie im folgenden alle ihnen gestellten Fragen und beobachten Sie den Test-Datenbankaufbau, nachdem sie einen Benutzernamen, das Passwort und einen Hostnamen eingeben haben.

Page 45: Dynamische Webseiten (CGI)  mit Perl

Erstes Perl Script zur MySQL Datenbank-Anbindung

#!usr/bin/perl -w

use DBI;

$dbh = DBI->connect ('DBI:mysql:ohlhauser_db:localhost', 'root','') or die "Fehler beim Verbinden mit Datenbank : $DBI::errstr\n";

# Einfügen der Werte# $dbh->do führt die in Klammern stehende Anweisung sofort aus. Diese Methode wird # verwendet für Anweisungen wie INSERT, UPDATE, CREATE oder DROP.$dbh->do("INSERT INTO schueler (name, vorname, geschlecht, geboren, betrieb) VALUES ('Haug','Uli','m','1982-01-01','Boss')");

# Verbindung zur Datenbank schließen$dbh->disconnect;

exit;

Page 46: Dynamische Webseiten (CGI)  mit Perl

Das Datenbank-Handle: $dbh

Das Datenbank-Handle, $dbh, hat viele Methode, die mit ihm assoziert werden können:•$dbh->do(SQL-Anweisung)Diese Anweisung führt die in Klammern stehende SQL-Anweisung sofort aus. Diese Methode wird verwendet, wenn sie Anweisungen wie INSERT, UPDATE, CREATE oder DROP, die keinen Ergebnissatz zurückgeben, benutzen.

•$dbh->prepare(SQL-Anweisung)Diese Anweisung generiert ein Anweisungs-Handle. Es verfügt über Methoden und Eigenschaften, die verwendet werden können, um die darin enthaltenen Daten zu beschreiben und zu manipulieren.1. execute(): Diese Methode führt die SQL-Anweisung aus, die in der prepare Methode übergeben wurde.2. fetchrow_hashref(): Diese Methode gibt ein assoziatives Array mit den Werten des Ergebnissatzes in einer Name=Wert-Paar-Relation zurück.3. finish(): Diese Anweisung zerstört das Anweisungs-Handle und gibt Ressourcen wieder frei.4. rows(): Diese Anweisung gibt die Anzahl der Datensätze zurück, die ein Ergebnis enthalten

•$dbh->disconnectDiese Anweisung schließt die Verbindung zur Datenbank.

Page 47: Dynamische Webseiten (CGI)  mit Perl

Die prepare()-Methode und das Anweisungs-Handle

#!usr/bin/perl -w

use DBI;

$dbh = DBI->connect ('DBI:mysql:ohlhauser_db:localhost', 'root','') or die "Fehler beim Verbinden mit Datenbank : $DBI::errstr\n";

$sth = $dbh->prepare("SELECT * From schueler WhERE betrieb='Boss'"); # Erstellen des Anweisungs-Handle und Übergabe an die Variable $sth $sth->execute(); # Anfrage wird an die Datenbank gesendet und ein Ergebnissatz zurückgegeben

while($ref = $sth->fetchrow_hashref()) # Jede Datenzeile wird durchlaufen {print "$ref->{'name'} $ref->{'vorname'}"; # und ausgegeben!print "\n";}$sth->finish();$dbh->disconnect;exit;

# Übungsaufgabe: Führen Sie weitere Abfragen aus!!!

Page 48: Dynamische Webseiten (CGI)  mit Perl

CGI, Perl, DBI und MySQL

Aufgabe: Erstellen einer Webseite, die Daten über ein Formular abfragt und diese anschließend in die schueler-Tabelle der nachname_db Datenbank einfügt.

Page 49: Dynamische Webseiten (CGI)  mit Perl

HTML-Quellcode des Formulars

<!doctype html public "-//w3c//dtd html 4.0 transitional//en"><html><head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Content-Language" content="en-us"> <meta name="GENERATOR" content="Mozilla/4.75 [de] (Windows NT 5.0; U) [Netscape]"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>Vendor</title></head><body><form method=post action= "cgi-bin/schueler.pl">&nbsp;<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH="555" HEIGHT="27" ><tr><td COLSPAN="3" WIDTH="824" HEIGHT="27"><center><b>Wilhelm-Schickard-Schule Tübingen</b></center><br></td></tr><tr><td COLSPAN="3" WIDTH="524" HEIGHT="27"><center><b>Hinzufügen von neuen IT-Schülern in die MySQL-Datenbank nachname_db<br> Bitte das Formular ausfüllen!</b></center></td></tr><tr><td><br></td></tr>

Page 50: Dynamische Webseiten (CGI)  mit Perl

HTML-Quellcode des Formulars

<tr><td COLSPAN="3" WIDTH="524" HEIGHT="27" BGCOLOR="#9C9C4E"><b>&nbsp;Name:&nbsp;</b><input type="text" name="Nachname" size="51"></td></tr><tr><td COLSPAN="3" WIDTH="524" HEIGHT="27" BGCOLOR="#9C9C4E"><b>Vorname:&nbsp;</b><input type="text" name="Vorname" size="51"></td></tr><tr><td COLSPAN="3" WIDTH="50" HEIGHT="27" BGCOLOR="#9C9C4E"><b>Geschlecht:&nbsp;</b><input type="text" name="Geschlecht" size="20"></td></tr><tr><td COLSPAN="3" WIDTH="524" HEIGHT="27" BGCOLOR="#9C9C4E"><b>geboren:&nbsp;&nbsp;&nbsp;&nbsp;</b><input type="text" name="Geboren" size="51"></td></tr><tr><td COLSPAN="3" WIDTH="524" HEIGHT="27" BGCOLOR="#9C9C4E"><b>Betrieb:&nbsp;</b><input type="text" name="Betrieb" size="51"></td></tr><tr><td><br></td></tr><tr><td COLSPAN="3" WIDTH="801" HEIGHT="27"><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></td></tr></table></form></body></html>

Page 51: Dynamische Webseiten (CGI)  mit Perl

Perl-Skript, um Daten in die Datenbank einzufügen (schueler.pl)

#!/usr/bin/perl

use DBI;

############################################################################# Connect to the MySQL WEB database #############################################################################

$dbh = DBI->connect ('DBI:mysql:ohlhauser_db:localhost', 'root','') or die "Fehler beim Verbinden mit Datenbank : $DBI::errstr\n";

%postInputs = readPostInput();

$Nachname = $postInputs{'Nachname'};$Vorname = $postInputs{'Vorname'};$Geschlecht = $postInputs{'Geschlecht'};$Geboren = $postInputs{'Geboren'};$Betrieb = $postInputs{'Betrieb'};

$dbh->do("INSERT INTO schueler VALUES('$Nachname', '$Vorname', '$Geschlecht', '$Geboren',

'$Betrieb')");

$dbh->disconnect;

Page 52: Dynamische Webseiten (CGI)  mit Perl

Fortsetzung: Perl-Script, um Daten in die Datenbank einzufügen ############################################################################# Subroutine für die Verarbeitung des Post Request in einen assoziativen ## array. Quellcode für alle CGI-Applikation gleich. # ############################################################################

sub readPostInput{my (%searchField, $buffer, $pair, @pairs);

if ($ENV{'REQUEST_METHOD'} eq 'POST'){read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});@pairs = split(/&/, $buffer);

foreach $pair(@pairs){($name, $value) = split(/=/, $pair);$value =~ tr/+/ /;$value =~ s/%([a-fA-f0-9][a-fA-F0-9])/pack("C", hex($1))/eg;$name =~ tr/+/ /;$name =~ s/%([a-fA-f0-9][a-fA-F0-9])/pack("C", hex($1))/eg;$searchField{$name} = $value;

}}

return (%searchField);}

# Bestätigungsmeldung an den Browser, dass der Schüler erfolgreich in die Datenbank # eingetragen ist

print "Content-Type: text/html\n\n";print "<html><head><title>Datensatz hinzugefügt</title></head>";print "<body>Der Schüler ist hinzugefügt</body>";print "</html>";