Wo Sie die Beispiele und den Code finden
Beispiel 1:
Formulareingaben sammeln, formatieren und als E-Mail versenden
Beispiel 2:
Ein Konvertierprogramm von RGB nach Hexadezimal
Beispiel 3:
Ein Adreßbuch durchsuchen
Tag 10
Kapitel 20 - Nützliche Formulare und Skripte
Das Lernen anhand von Beispielen ist eine Lebensform im Web. Man kann sich stets den Quellcode für die HTML-Seiten im Web ansehen, wenn also irgend jemand etwas Interessantes kreiert hat, können Sie es nachvollziehen. Bei Formularen ist es jedoch schwieriger, diese attraktiven Komponenten kennenzulernen, weil Sie die Skripten nicht erhalten, die zur Verarbeitung der Formulare verwendet werden, es sei denn, sie werden explizit zur Verfügung gestellt.
Dieses Kapitel enthält vier Formulare oder Skripten für allgemeine und praktische Aufgaben, die Sie in ihrer Art vielleicht in Ihre eigenen Seiten aufnehmen wollen. Es enthält außerdem Anweisungen und Beispielcode für die folgenden Dinge:
Wie ich bereits im vorigen Kapitel erwähnte, erfordern eine Menge der raffinierten Dinge, die Sie mit Formularen und Interaktivität auf Ihren Webseiten verwirklichen können, zumindest etwas Grundwissen im Programmieren. Die Beispiele in diesem Kapitel verwenden Perl, eine Programmiersprache, die fürs CGI-Programmieren beliebt ist. Um dieses Kapitel voll ausnutzen zu können, sollten Sie ein grundlegendes Verständnis der Programmierkonzepte und von CGI, so wie ich es im vorigen Kapitel beschrieben habe, mitbringen. |
Bei diesem Kapitel hat mir Eric Murray entscheidend geholfen, der fast alle CGI-Skripten für die Beispiele geschrieben hat (insbesondere, wenn sie in Perl geschrieben wurden). Danke Eric, daß du diese Beispiele neben deiner täglichen Arbeit noch schreiben konntest. |
Wo Sie die Beispiele und den Code finden
Alle Beispiele aus diesem Kapitel sowie den Code für die Formulare und die zugehörigen CGI-Skripten finden Sie im Web auf den folgenden Seiten:
http://www.lne.com/Web/Examples/
Wenn Sie in diesem Kapitel etwas finden, was Sie gerne verwenden wollen, besuchen Sie einfach den entsprechenden Site. Wenn Sie die Formulare in Ihren eigenen Web-Präsentationen einsetzen, geben Sie eine Verknüpfung zu unserer Site an, damit auch andere die Informationen finden können. Weitere Richtlinien finden Sie an Ort und Stelle.
Beispiel 1:
Formulareingaben sammeln, formatieren und als E-Mail versenden
In diesem ersten Beispiel beginnen wir mit etwas ganz Einfachem, das Sie sich schon lange wünschen: einem CGI-Skript, das nur die Eingaben von einem Formular entgegennimmt, sie formatiert und das Ergebnis per E-Mail an den Autor sendet.
Wie alles funktioniert
Hier finden Sie ein einfaches Beispiel, wie diese Kombination aus Formular und CGI-Skript funktioniert. Es heißt Surrealist Census, und sein Formular ist in Abbildung 20.1 gezeigt.
Abbildung 20.1: |
Nachdem der Leser das Formular ausgefüllt hat, schickt er es ab und erhält eine freundliche Antwort (wie in Abbildung 20.2 gezeigt).
Die Ergebnisse werden via E-Mail an die Person geschickt, die das Formular geschrieben hat. Abbildung 20.3 zeigt diese Mail.
Abbildung 20.2: |
Abbildung 20.3: |
Das Formular
Hier der HTML-Code für das Formular von Surrealist Census:
<HTML><HEAD>
<TITLE>The Surrealist Census</TITLE>
</HEAD><BODY>
<H1>The Surrealist Census</H1>
<P>Welcome to the Surrealist Census. Please full out the following
form to the best of your abilities.</P>
<P>Use <STRONG>Submit</STRONG> To submit your results.
<HR>
<FORM METHOD="POST" ACTION="/cgi-bin/uncgi/mailcensus">
<P><STRONG>Name: </STRONG><INPUT TYPE="TEXT"
NAME="theName"></P>
<P><STRONG>Sex: </STRONG>
<INPUT TYPE="radio" NAME="theSex" VALUE="male">Male
<INPUT TYPE="radio" NAME="theSex"
VALUE="female">Female
<INPUT TYPE="radio" NAME="theSex" VALUE="null">Null
</P>
<P><STRONG>Contains (Select all that Apply): </STRONG><BR>
<INPUT TYPE="checkbox" NAME="humor">Vitreous Humor<BR>
<INPUT TYPE="checkbox" NAME="fish">Fish<BR>
<INPUT TYPE="checkbox" NAME="glycol">Propylene Glycol<BR>
<INPUT TYPE="checkbox" NAME="svga">SVGA Support<BR>
<INPUT TYPE="checkbox" NAME="angst">Angst<BR>
<INPUT TYPE="checkbox" NAME="catcon">Catalytic
Converter<BR>
<INPUT TYPE="checkbox" NAME="vitamin">Ten Essential Vitamins and
Nutrients<BR>
</P>
<P><INPUT TYPE="SUBMIT" VALUE="Submit Your Votes">
<INPUT TYPE="RESET" VALUE="Clear Form"></P>
<FORM>
<HR>
</BODY></HTML>
Einige Anmerkungen zu diesem Formular:
Das Skript
Nun wollen wir uns mit dem Skript für die Verarbeitung des Formulars beschäftigen. Dieses Skript wurde in der Bourne-Shell geschrieben und stellt ein einfaches Beispiel dar, das die Formulardaten in einer temporären Datei ablegt und dann den Dateiinhalt per Mail an irgend jemanden sendet (hier ist das der Alias Web-Master). Sie könnten diese Datei modifizieren, so daß sie den Inhalt des Formulars an eine bereits existierende Datei anhängt, das Ergebnis auf Ihrem Drucker ausgibt oder es an Ihren Freund in Oldenburg sendet. Der Knackpunkt ist, daß dieses Skript einfach nur Formulareingaben sammelt und sie irgendwo ausgibt. Diese Eingaben werden nicht verarbeitet.
Im ersten Schritt wird eine temporäre Datei erzeugt, die die formatierten Daten speichert. Sie wird der Variablen TMP zugeordnet. Diese Zeile erzeugt eine temporäre Datei, wobei die Prozeß-ID des Skripts angehängt wird (der $$-Teil), um einen eindeutigen Dateinamen zu erzeugen und zu verhindern, daß andere temporäre Dateien überschrieben werden, die das Skript möglicherweise gleichzeitig verwenden.
#!/bin/sh
TMP=/tmp/mailcensus.$$
Jetzt fügen wir der Datei eine einfache Überschrift hinzu:
echo "Surrealist Census Results"
>> $TMP
echo "-----------" >> $TMP
echo >> $TMP
Als nächstes werden die Werte der Felder theName und theSex an dieselbe Datei angehängt, ebenso wie eine Unterüberschrift für Contains. Beachten Sie, daß das Programm uncgi am Anfang jeder Variablen, wie Sie im letzten Kapitel erfahren haben, das Präfix WWW_ schreibt.
echo "Name: $WWW_theName"
>> $TMP
echo "Sex: $WWW_theSex" >> $TMP
echo >> $TMP
echo "Contains:" >> $TMP
Der nächste Abschnitt gibt die Kontrollkästchen für die Daten dieser Person aus. Hier werte ich alle Kontrollkästchenvariablen aus und gebe nur die markierten aus, so daß die Liste in der temporären Datei eine Untermenge der gesamten Liste enthält (es sei denn, alle Elemente wurden markiert). Sie können dieses Skript modifizieren, um die Liste in anderer Form auszugeben - beispielsweise durch die Angabe von JA oder NEIN hinter den Namen der einzelnen Kontrollkästchen, um zu kennzeichnen, welche davon selektiert wurden. Da es Ihnen überlassen ist, wie Sie die Formulareingaben verarbeiten, können Sie auch bestimmen, wie sie präsentiert werden sollen.
Für Kontrollkästchen ist der Standardwert, der für den markierten Zustand gesendet wird, »on«. Hier überprüfen wir die einzelnen Kontrollkästchenvariablen auf diesen Wert hin, wie etwa im folgenden Beispiel:
if [ "$WWW_humor" =
"on" ]; then
echo " Vitreous Humor" >> $TMP
fi
if [ "$WWW_fish" = "on" ]; then
echo " Fish" >> $TMP
fi
if [ "$WWW_glycol" = "on" ]; then
echo " Propylene Glycol" >> $TMP
fi
Da diese Überprüfung für die einzelnen Kontrollkästchen im wesentlichen immer dieselbe ist, werde ich hier nur ein paar davon aufzeigen. Wenn Sie das vollständige Skript sehen wollen, laden Sie es sich vom Web herunter.
Nachdem alle Daten gesammelt und formatiert wurden, versenden wir sie als Mail. Diese Zeile schickt die ganze temporäre Datei als Mail an das Web-Master-Alias, wobei als Thema Survey Results angegeben wird:
mail -s "Survey Results" Web-Master < $TMP
Nun löschen wir die temporäre Datei, damit nicht Ihr ganzes /tmp-Verzeichnis vollgeschrieben wird:
rm $TMP
Jetzt denken Sie vielleicht, Sie seien fertig, aber Sie müssen ja noch etwas an den Browser zurückgeben, so daß Ihr Leser weiß, daß alles in Ordnung ist. Wir geben den Standard-Header und eine einfache HTML-Seite aus:
echo Content-type: text/html
echo
echo "<HTML><HEAD>"
echo "<TITLE>The Surrealist Census: Thank You</TITLE>"
echo "</HEAD><BODY>"
echo "<H1>Thank you for voting!</H1>"
echo "<P>Your votes in the Surrealist Census will be tallied and"
echo "used for reasons wholly inappropriate to herding sheep.</P>"
echo "</BODY></HTML>"
Speichern Sie Ihre Datei unter dem Namen mailcensus, installieren Sie sie in Ihrem Verzeichnis cgi-bin, und überprüfen Sie, ob sie ausführbar ist. Anschließend können Sie sie von Ihrem Formular aus ausführen.
Mail von Nobody?
Wenn Sie sich dieses Skript herunterladen und auf Ihrem eigenen System einsetzen, werden Sie wahrscheinlich sofort feststellen, daß die Mail, die es an Sie schickt, vom Benutzer Nobody (Niemand) kommt. Die erste Frage wird sein: »Wie kann ich mein Skript so umschreiben, daß die Mail vom tatsächlichen Benutzer gesendet wird?«
Die Antwort ist: Das geht nicht. Wenn der Browser die Daten von dem Formular zum Server sendet, sendet er den Namen des Systems, von dem die Anforderung kam (enthalten in der Umgebungsvariablen REMOTE_HOST). Er sendet jedoch nicht den Namen des Benutzers, der das Formular gesendet hat (REMOTE_USER wird für paßwortgeschützte Seiten verwendet; mehr darüber erfahren Sie in Kapitel28, »Web-Server: Sicherheit und Zugriffskontrolle«).
Betrachten Sie es so: Wenn der Browser die E-Mail-Adresse von allen senden würde, die Ihr Formular eingeschickt haben, dann könnten Sie diese Adressen sammeln und ihnen unsinnige Mails senden. Zum Schutz der Privatsphäre haben die meisten, wenn nicht sogar alle Browser-Entwickler sich darauf geeinigt, nichts zu senden, was die E-Mail-Adresse eines Benutzers betrifft, wenn ein Formular übertragen wird.
Wenn Sie die E-Mail-Adressen wollen, dann fragen Sie in Ihrem Formular danach. Wenn Ihre Leser wollen, daß Sie sie erreichen, dann werden sie ihre Adressen eintragen.
Wie das Skript an eine Datei angefügt wird
Eine gebräuchliche Abänderung dieses Skripts ist, die Formulareingabe an eine Datei anzuhängen, statt sie via Mail zu versenden. Das ist insbesondere für einfache Textdatenbanken praktisch, etwa für das Adreßbuch, das Sie später in diesem Kapitel noch kennenlernen werden.
Wenn Sie Ihr CGI-Skript in eine Datei schreiben wollen, sollten Sie beachten, daß CGI-Skripten unter Unix vom Server mit dem Namen Nobody ausgeführt werden (das ist zumindest der Standard; möglicherweise hat Ihr Server-Administrator einen anderen Namen gewählt). Das ist nicht schlecht, weil der Server nicht verrückt spielen und alles auf der Maschine löschen kann. Andererseits hat der Benutzer Nobody vielleicht keinen Zugriff auf die Datei, in die Sie schreiben wollen. In diesem Skript hat er Zugriff auf die temporäre Datei, weil sie sich im Verzeichnis /tmp befindet, auf das alle Zugriff haben.
Um dieses Problem zu umgehen, stellen Sie sicher, daß jeder Ihre temporäre Datei lesen und schreiben kann (world-writeable), indem Sie mit dem Befehl chmod die Dateirechte abändern (der exakte Befehl ist chmod a+w dateiname). Das bedeutet natürlich auch, daß jeder in Ihrem System etwas hineinschreiben (oder den Inhalt löschen) kann. Vielleicht wollen Sie sie deshalb auch irgendwo auf Ihrem System verstecken oder in regelmäßigen Abständen in einer nicht überschreibbaren Datei sichern.
Allgemeine Mail-Skripts und gefälschte Mail
Eine weitere Möglichkeit wäre, das Skript allgemein zu gestalten und verschiedene E-Mail-Adressen als Bestandteil des Formulars zu übergeben, entweder als Abfragestring oder in einem verborgenen Feld. Dann können mehrere Leute dasselbe Skript verwenden, und Sie schreiben das Verzeichnis cgi-bin nicht mit irgendwelchen Skripten voll, die alle dasselbe enthalten.
Na gut, nicht ganz. Das Problem bei der Übergabe eines E-Mail-Arguments vom Formular an Ihr Skript ist, daß jeder Ihr Skript von jedem beliebigen Formular aus mit einer beliebigen E-Mail-Adresse aufrufen kann. Ihr Skript sendet freudig Daten an alle E-Mail-Adressen, die man ihm übermittelt. Angenommen, jemand hat Ihr Formular gespeichert und bearbeitet, so daß das Mail-Argument auf joe@randomsite.com zeigt. Diese Person könnte dann Ihr mailcensus-Skript verwenden, um Ihre so gesammelten Daten möglicherweise tausendmal an joe@randomsite.com zu senden, wobei immer Ihr mailcensus-Skript verwendet würde; die Person könnte Ihre Rechenzeit verbrauchen und den armen Joe mit Mails bombardieren; Joe würde sich irgendwann bei Ihnen beschweren, weil Sie den einzig identifizierbaren Header in der Mail darstellen. Um das zu verhindern, sollten Sie die E-Mail-Adresse im Skript festschreiben oder eine Möglichkeit auf dem Server bereitstellen, die Adresse, an die die Mail gesendet wird, zu überprüfen.
Beispiel 2:
Ein Konvertierprogramm von RGB nach Hexadezimal
RGBtoHex ist ein Konverter, der drei RGB-Zahlen (0-255) entgegennimmt, und ein Hexadezimal-Tripel (#NNNNNN) zurückgibt, das Sie beispielsweise für einen Netscape-Hintergrund oder andere bildverarbeitende Programme nutzen können, die die Spezifikation von Farben auf diese Weise fordern.
Das Skript für die Umwandlung ist eigentlich ganz einfach. Die Konvertierung von ASCII in Hex ist keine schwierige Aufgabe. Aber dieses Beispiel ist in Perl geschrieben, und es bietet eine gute Einführung in die umfassenderen Perl-Skripten im weiteren Kapitel.
Wie es funktioniert
Abbildung 20.4 zeigt das Formular für dieses Beispiel, das einige Bedienanweisungen sowie drei Textfelder für die Zahlen von 0 bis 255 enthält.
Wenn Sie beispielsweise 155 155 155 eingeben (ein wunderbarer Grauton) und auf Submit Values drücken, erhalten Sie das in Abbildung 20.5 gezeigte Ergebnis. Dieses Hexadezimal-Tripel können Sie in Ihre HTML-Dateien oder in andere Programme kopieren.
Abbildung 20.4: |
Abbildung 20.5: |
Das Formular
Das Formular, das das Skript RGBtoHex aufruft, ist ganz einfach: drei Textfelder und die unumgänglichen Schaltflächen Submit und Reset, es sieht etwa so aus:
<HTML><HEAD>
<TITLE>RGBtoHex: an RGB to Hexadecimal Color Converter</TITLE>
</HEAD><BODY>
<H2>RGBtoHex</H3>
<P>RGBtoHex converts standard RGB values (three 0 to 255 ASCII numbers
indicating red, green, and blue), into a hexadecimal triplet that can
be used for the background and text colors in Netscape 1.1 or in any
other program that requires colors in this format.
<HR>
<FORM METHOD=POST ACTION="/cgi-bin/rgb.cgi">
<P>Please enter the RGB values for your color:
<P>Red (0-255): <INPUT TYPE="text" NAME="red"><BR>
Green (0-255): <INPUT TYPE="text" NAME="green"><BR>
Blue (0-255): <INPUT TYPE="text" NAME="blue"><BR>
<INPUT TYPE="submit" VALUE="Submit Values"><INPUT
TYPE="reset"
VALUE="Clear Values">
<HR>
</BODY></HTML>
Das einzige, was hier kommentiert werden soll, sind die Namen der Textfelder: red, green und blue. Sie benötigen Sie für das Skript. Beachten Sie, daß der Name des Skripts rgb.cgi ist und sich im cgi-bin-Verzeichnis Ihres Servers befindet. Sie müssen den ACTION-Teil Ihres Formulars dahingehend verändern, daß er auf Ihr eigenes Skript zeigt.
Das Skript
Für die Umwandlung der RGB-ASCII-Werte in ein Hexadezimal-Tripel wird ein einfaches Perl-Skript verwendet, das die Bibliothek cgi-lib.pl verwendet, um die Formularwerte zu decodieren. (cgi-lib.pl wurde im vorigen Kapitel beschrieben). Hier ein kurzer Einblick in das Skript:
Die erste Zeile zeigt, daß es sich um ein Perl-Skript handelt, im Gegensatz zu einem Bourne-Shell-Skript. Wenn Sie Perl auf Ihrem System nicht unter /usr/local/bin/perl gespeichert haben, dann sollten Sie die folgende Zeile modifizieren, so daß sie auf das Skript zeigt:
#!/usr/local/bin/perl
Wenn Sie nicht wissen, wo sich Perl in Ihrem System befindet, geben Sie am Systemprompt which perl ein. Wenn Perl installiert ist und sich in Ihrem Suchpfad befindet, erhalten Sie damit den Pfad-Namen für das Perl-Programm. |
Jetzt kommen zuerst die ganzen Initialisierungen, die für ein CGI-Skript notwendig sind.
require 'cgi-lib.pl';
&ReadParse(*in);
print "Content-Type: text/html\n\n";
#Top of HTML file
print "<HTML><HEAD>\n"
print "<TITLE>RGBtoHex: Results</TITLE></HEAD><BODY>\n";
print "<H2>RGBtoHex: Result</H2>\n";
print "<HR>\n";
Diese Zeilen erledigen drei Dinge:
Aber jetzt weiter zum eigentlich Interessanten. Wir können kein Tripel erzeugen, wenn der Leser nicht in alle drei Textfelder Werte eingegeben hat. Deshalb überprüfen wir in diesem Abschnitt, ob bei der Übertragung des Formulars alle drei Werte eingetragen wurden.
In Perl erhalten Sie unter Verwendung von cgi-lib.pl die Wert-Komponente des Name-Wert-Tags, indem Sie auf den Namen des entsprechenden Arrays ($in) und den Namen des Namensschlüssels verweisen. $in{'red'} ergibt also den Wert, den der Leser in das Textfeld red eingegeben hat. Hier überprüfen wir alle Werte, um sicherzustellen, daß sie nicht leer sind, und melden gegebenenfalls einen Fehler zurück.
if (($in{'red'} eq '') || ($in{'green'} eq
'') ||
($in{'blue'} eq '')) {
print "You need to give all three values!";
} else {
Und jetzt kommt's. Die Umwandlung des ASCII-Werts in Hex ist eigentlich ganz einfach. Sie können das mit fast jedem wissenschaftlichen Taschenrechner bewerkstelligen, und in Perl wird dazu nur eine einfache Formatoption für die printf-Funktion verwendet (so wie in C). Aber zuerst wollen wir den ersten Teil ausgeben (der hier auf zwei Zeilen erscheint, sich aber in Ihrem Quellcode auf einer einzigen Zeile befinden sollte):
print "<p> RGB values of $in{'red'} $in{'green'} $in{'blue'} equals the hexadecimal value <B>";
Anschließend kommen die Hexzahlen, was Perl mit einer einfachen printf-Anweisung erledigt. Dabei werden jeweils zwei Stellen für jede Komponente des Tripels ausgegeben:
printf
("#%2.2X%2.2X%2.2X\n",$in{'red'},$in{'green'},$in{'blue'});
}
Jetzt noch die abschließenden HTML-Tags für das Dokument:
print "</B><BODY></HTML>\n";
Das ist alles. Speichern Sie das Beispiel als rgb.cgi, rufen Sie es auf, und los geht's!
Beispiel 3:
Ein Adreßbuch durchsuchen
Im dritten Beispiel verwenden wir ein komplexeres und umfangreicheres Skript. Wir fragen Informationen ab, die in einer Art Datenbank gespeichert sind - eigentlich in einer einfachen Textdatei, die auf dem Server liegt. Das Formular erlaubt die Eingabe von Schlüsselwörtern, nach denen gesucht werden soll. Das Skript gibt eine HTML-Datei mit übereinstimmenden Datensätzen zurück.
Wie es funktioniert
Bei der Datenbank für dieses Beispiel handelt es sich eigentlich um eine einfache Textdatei, die lauter Adreßdaten enthält. Jeder Datensatz bietet Informationen über eine einzelne Person, unter anderem Adresse, Telefonnummer, E-Mail usw. (Details über das Dateiformat finden Sie im nächsten Abschnitt.) Das Suchformular (siehe Abbildung 20.6) besteht aus mehreren Textfeldern, mit deren Hilfe Sie nach Schlüsselwörtern in beliebigen Abschnitten der Datenbank suchen können.
Abbildung 20.6: |
Wenn das Formular übertragen wird, durchsucht das CGI-Skript die Adreßdatei und gibt alle gefundenen Datensätze zurück, zusammen mit automatisch erzeugten Links für die E-Mail- und Homepage-Felder, wie in Abbildung 20.7 gezeigt.
Abbildung 20.7: |
Wenn Sie in mehreren Feldern des Formulars Suchinformationen eingeben, gibt das Suchskript alle Datensätze zurück, die eines dieser Schlüsselwörter enthalten. Wenn Sie also in das Feld Name laura eingeben und in das Feld Email lne.com, prüft das Skript jeden Datensatz, ob er laura oder lne.com enthält, und gibt dann alle Datensätze zurück, die eines dieser Schlüsselwörter enthalten.
Die Datei
Bei der vom Formular durchsuchten Adreßbuchdatei handelt es sich um eine einfache Textdatei, die mehrere Datensätze für einzelne Personen enthält, jeweils durch Leerzeilen voneinander abgetrennt. Diese Datensätze sehen etwa wie folgt aus:
Name: Laura Lemay
Address: 11 Palm Tree Lane, Brunford, CA 91234
Home Phone: (415) 555-5555
Work Phone: (415) 555-6666
Email Address: lemay@lne.com
Home Page: http://www.lne.com/lemay/
Jeder Datensatz setzt sich aus mehreren Feldern zusammen, unter anderem Name, Adresse usw. Der Feldname und der Feldinhalt sind jeweils durch einen Doppelpunkt getrennt. Felder, die keine Information enthalten, werden dennoch angezeigt, aber es erfolgt keine Wertangabe, dies sieht etwa so aus:
Name: Andrew Fnutz
Address: 5555555 SE North St. West Forward, ND 00554
Home Phone: (411) 555-8888
Work Phone:
Email Address: fnutz@loothmid.zurk.com
Home Page:
Die Adreßdaten befinden sich irgendwo auf dem Server, wo das Skript darauf zugreifen kann. Bei mir heißen sie address.data und befinden sich in meinem Web-Verzeichnis. Sie können Ihr eigenes Adreßverzeichnis erzeugen oder meines zu Testzwecken benutzen (Sie finden es auf der CD-ROM, die diesem Buch beiliegt). |
Das Formular
Das Formular zum Durchsuchen des Adreßbuchs ist ganz einfach - es besteht nur aus mehreren Textfeldern. Nichts Neues oder gar Aufregendes. Ich habe in diesem Beispiel vorformatierten Text verwendet, so daß die Felder alle in einer Reihe stehen.
<HTML><HEAD>
<TITLE>Address Book Search Forms</TITLE>
</HEAD><BODY>
<H1>WWW Address Manager</H1>
<P>Enter search values in any field.
<PRE><HR>
<FORM METHOD=POST ACTION="/cgi-bin/address.cgi">
<P><B>Name:</B> <INPUT TYPE="text" NAME="Name"
SIZE=40>
<P><B>Address:</B> <INPUT TYPE="text"
NAME="Address" SIZE=40>
<P><B>Home Phone:</B> <INPUT TYPE="text"
NAME="Hphone" SIZE=40>
<P><B>Work Phone:</B> <INPUT TYPE="text"
NAME="Wphone" SIZE=40>
<P><B>Email Address:</B> <INPUT TYPE="text"
NAME="Email" SIZE=40>
<P><B>Home Page: </B> <INPUT TYPE="text"
NAME="WWW" SIZE=40>
</PRE>
<INPUT TYPE="submit" VALUE="Search"><INPUT
TYPE="reset" VALUE="Clear">
<HR>
</FORM></BODY></HTML>
Das Skript
Jetzt weiter zum Skript address.cgi. Auch hier handelt es sich um ein Perl-Skript, das allerdings etwas komplizierter ist als das RGBtoHex-Skript. Aber auch dieses Skript beginnt mit den Zeilen zum Einbinden von cgi-lib.pl, decodiert die Formulareingabe und gibt den ersten Teil der Antwort aus.
#!/usr/local/bin/perl
require 'cgi-lib.pl';
&ReadParse(*in);
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>Address Book Search
Results</TITLE></HEAD>\n";
print "<BODY><H1>Addresss Book Search Results</H1>\n";
Um das Adreßbuch zu durchsuchen, muß das Skript wissen, wo sich dieses befindet. Die erste Zeile zeigt auf die Datei im lokalen Dateisystem, die die Daten enthält. (Ändern Sie sie so ab, daß sie auf Ihre eigene Datendatei zeigt.) Die nächste Zeile öffnet diese Datei zum Lesen (fügen Sie hier den vollständigen Pfad-Namen zu dieser Datei auf Ihrem eigenen System ein):
$data="/home/www/Web/Books/Examples/Professional/chap20/address/address.data";
open(DATA,"$data") || die "Can't open $data:
$!\n</BODY></HTML>\n";
Jetzt kommt das Schwierigste. Im nächsten (langen) Codeabschnitt, der in einer while-Schleife enthalten ist (while(<DATA>) {...}) werden die Daten in der Datei zeilenweise gelesen, wobei für jede Zeile mehrere Überprüfungen ausgeführt werden. Die gesamte Schleife erledigt mehrere Dinge:
Lassen Sie uns mit dem ersten Teil der while-Schleife anfangen und dann mit dem Befehl chop, der überflüssige nachfolgende neue Zeilen am Ende der aktuellen Zeile entfernt.
while(<DATA>) {
chop; # delete trailing \n
Innerhalb der while-Schleife führen wir verschiedene Tests aus. Die Schleife testet jede Zeile, um zu sehen, ob es Übereinstimmungen mit den Suchkriterien gibt. Sie testet auch, ob wir eine Leerzeile erreicht haben. Beachten Sie, daß die Datensätze in der Adreßdatei durch leere Zeilen voneinander abgetrennt werden; wenn die Schleife also eine Leerzeile findet, dann weiß sie, daß sie einen ganzen Datensatz gelesen hat. Im nächsten Code-Block werden wir wieder nach einer Leerzeile suchen und noch einen zusätzlichen Test ausführen, um herauszufinden, ob in diesem Eintrag bereits vorher Übereinstimmungen gefunden wurden. Wenn eine Leerzeile und eine Übereinstimmung gefunden werden, wird dieser Code-Block folgendes erledigen:
Unabhängig davon, ob eine Übereinstimmung gefunden wurde, zeigt die Anwesenheit einer Leerzeile an, daß das Ende eines Datensatzes erreicht wurde, so daß das Programm noch zwei weitere Aufgaben erledigt:
Und hier der Code, der auf eine Leerzeile und eine Übereinstimmung hin prüft, den Eintrag verarbeitet und dann alles wieder löscht:
if (/^\s*$/) { #blank line means end of
record
if ($match) {
# if anything matched, print the whole record
&printrecord($record);
$nrecords_matched++;
}
undef $match;
undef $record;
next;
}
Jetzt führen wir die eigentlichen Überprüfungen der Felddaten durch. Die Datendatei enthält ihre Zeilen im Format Tag: Wert, beispielsweise Email: lemay@lne.com. Die nächste Codezeile trennt diese Information in zwei Komponenten auf und schreibt ihren Inhalt in die Variablen tag und value.
($tag,$val) = split(/:/,$_,2);
Und jetzt kommen die eigentlichen Überprüfungen. Es gibt sechs einzelne Tests (einen für jedes Feld: Name, Address, HomePhone, WorkPhone, Email und Homepage), aber da sie im wesentlichen alle gleich aussehen, werde ich hier nur zwei davon angeben. Die vollständige Datei finden Sie auf der CD-ROM, falls Sie daran interessiert sind. |
Jede dieser Suchen überprüft die Variable tag, um festzustellen, ob wir gerade eine Zeile mit dem entsprechenden Feldnamen lesen. Wenn das der Fall ist, vergleicht das Skript den Wert der Zeile mit dem Suchschlüssel, den es gegebenenfalls für dieses Feld hat. Wenn das Skript eine Übereinstimmung findet, setzt es die Variable match. Egal aber, ob es eine Übereinstimmung findet, das Skript kopiert die Zeile auf alle Fälle in das Array.
Hier die Überprüfungen für die Felder mit Name und Adresse:
if ($tag =~ /^Name/i) {
$match++ if( $in{'Name'} && $val =~ /\b$in{'Name'\b/i) ;
$record = $val;
next;
}
if ($tag =~ /^Address/i) {
$match++
if( $in{'Address'} && $val =~ /\b$in{'Address'}\b/i) ;
$record .= "\n<BR>$val" if ($val);
next;
}
Schließlich gibt es ganz unten in der Schleife noch eine weitere Zeile. Wenn es in der Datendatei Zeilen gibt, die keinem Feld zugeordnet sind, wollen wir sie trotzdem beibehalten. Wenn wir also eine finden, kopieren wir sie einfach in das Array:
$record .= $_;
}
Nachdem die Schleife abgearbeitet ist und wir alles gefunden haben, was wir wollten, schließen wir die Datendatei:
close DATA;
Was passiert, wenn keine Datensätze gefunden wurden? Sie wissen vielleicht noch, daß es am Anfang der Schleife eine Variable für nrecords_matched gab. Wenn wir einen übereinstimmenden Datensatz finden, setzen wir diese Variable. Wenn es also keine übereinstimmenden Datensätze gibt, wird sie niemals gesetzt. Hier überprüfen wir sie und geben eine Meldung aus, wenn sie nicht gesetzt ist:
if (! defined $nrecords_matched)
{ print "<H2>No Matches</H2>\n"; }
Jetzt noch die abschließenden HTML-Tags:
print
"</BODY></HTML>\n";
exit;
Aber wir sind noch nicht ganz fertig. Der letzte Teil des Skripts enthält eine Unterroutine, die den Datensatz in HTML-Format ausgibt.
sub printrecord {
local($buf) = @_;
print "<P>\n$buf\n";
}
Weitere Ideen
Dieses Beispiel war ganz einfach - einfach nur eine Datendatei und ein Suchskript. Ein paar weitere Skripten, und Sie könnten Formulare entwickeln, die Einträge im Adreßbuch hinzufügen, löschen oder modifizieren. Sie könnten Formulare verwenden, die die Information in verschiedenen Layoutformaten zusammenfassen. Sie könnten aber auch völlig abheben und ein Formular erzeugen, das für einen bestimmten Namen die Telefonnummer als Tonwahl über Ihren Lautsprecher ausgibt, so daß Sie Ihr Telefon an Ihren Lautsprecher halten und es wählen lassen. Aber vielleicht auch besser nicht. Wenn man überlegt, wie lange es dauern würde, bis Sie Ihren Web-Browser gestartet, das Formular gefunden, den Namen eingetippt und auf die Antwort gewartet haben, können Sie genausogut auch gleich selber wählen. Jedenfalls soll dieses einfache Skript Ihnen nur einen Vorgeschmack davon geben, was Sie mit einer datenbankähnlichen Datei auf Ihrem Server anfangen können.
Beispiel 4:
Ein Gästebuch
Nachdem Sie nun die Perl-Skripts zur Genüge kennengelernt haben, wollen wir ein komplexeres Beispiel betrachten: eine Gästebuchseite, auf der Ihre Leser Kommentare über Ihre Seiten abgeben können. Das Skript für die Verarbeitung des Gästebuchs trägt den Kommentar automatisch in eine Datei ein.
Wie es funktioniert
Wenn Ihre Leser Ihre erste Gästebuchseite sehen, dann erhalten Sie etwa die in Abbildung 20.8 gezeigte Anzeige.
Abbildung 20.8: |
Jeder Eintrag im Gästebuch zeigt den Namen, eine E-Mail-Adresse (das ist ein Link zum URL mailto:) sowie all die netten Dinge, die der Leser über Ihre Seiten sagen will. Ganz unten in der Gästebuchdatei befindet sich ein Formular, in das die Leser ihre eigenen Kommentare einfügen können (siehe Abbildung 20.9).
Abbildung 20.9: |
Ihre Leser können hier ihre Namen und E-Mail-Adressen sowie einige Kommentare (die gegebenenfalls auch HTML-Tags enthalten können) einfügen und dann POST anklicken. Das Skript aktualisiert die Datei und gibt eine Bestätigung zurück (siehe Abbildung 20.10).
Wenn der Leser zum Gästebuch zurückkehrt, wird sein Kommentar in die Liste aufgenommen (siehe Abbildung 20.11).
Abbildung 20.10: |
Abbildung 20.11: |
Anders als normale Gästebuch-Applikationen hängt das CGI-Skript für dieses Formular den neuen Kommentar nicht nur am Ende einer Datei an. Es fügt den neuen Kommentar in die Datei ein, aktualisiert das Datum, erzeugt die entsprechenden Verknüpfungen und formatiert alles wunderbar. Ein gutes Stück CGI-Codierung!
Atmen Sie gut durch: Es wird lang und kompliziert. Wenn Sie irgendwo nicht mehr weiterkommen, blättern Sie einfach zurück. Weil diese Dateien auch im Web vorliegen, können Sie jederzeit auch das Original betrachten.
Das Formular für unser Gästebuch
Der HTML-Code für das Gästebuch ist im wesentlichen eine einfache HTML-Datei mit einem Formular am Ende. Damit das CGI-Skript erkennen kann, wie es die Datei aktualisieren soll, enthält die HTML-Datei jedoch noch einige Extras, die wir hier detailliert erklären wollen.
Zunächst wieder die Standardangaben in HTML:
<HTML>
<HEAD>
<TITLE>Comments!</TITLE>
</HEAD>
</BODY>
Dieser HTML-Kommentar ist der erste in der HTML-Datei, der dem CGI-Skript helfen soll, alles dorthin zu schaffen, wo es hingehört. Der Kommentar GUESTBOOK teilt dem CGI-Skript mit, daß es sich wirklich um ein Gästebuch handelt. Sie müssen diesen Kommentar irgendwo in der HTML-Datei haben, weil Ihr Skript die Datei sonst nicht aktualisiert. Sie können diesen Kommentar an einer beliebigen Stelle ablegen, aber ich habe ihn hier ganz vorne eingefügt:
<!-GUESTBOOK->
Jetzt erzeugen wir einen einfachen Titel und einen Hinweis, daß hier das Gästebuch beginnt:
<H1>Comments!</H2>
<P>Here are comments people have left about my pages.
Post your own using the form at the end of the page.
Nun wird eine kleine Statistik über die Datei eingefügt. Der Kommentar LASTDATE teilt dem CGI-Skript mit, wo die neuen Daten eingefügt werden sollen (er wird jedesmal aktualisiert, wenn jemand etwas in das Gästebuch einträgt).
Comments list started on Apr 4 1995
Last post on <!-LASTDATE->
Und nun erfahren Sie, wie der erste Eintrag aussieht (die Schablone hat diesen ersten Eintrag nicht). Alle Einträge in der HTML-Datei sehen diesem ähnlich, mit einem Trennstrich, dem Namen des entsprechenden Schreibers, seiner E-Mail-Adresse als mailto-URL, dem Datum und dem eigentlichen Kommentar.
<HR><B>Laura Lemay <A
HREF=mailto:lemay@lne.com>lemay@lne.com
</A></B> Tue Apr 18 21:00:15 EDT 1995
<P>Test the guestbook...
Nach all den Einträgen in der Datei finden wir einen Kommentar namens POINTER. Er ist sehr wichtig, weil er dem CGI-Skript anzeigt, wo es neue Einträge einfügen soll.
<!-POINTER->
Das Formular bildet den Rest der Datei:
<HR>
Post a response:
<BR>
<FORM METHOD=POST
ACTION="/cgi-bin/guestbook.cgi/lemay/examples/guestbook.html">
Name: <INPUT TYPE="text" NAME="name" SIZE=25 MAXLENGTH=25>
<BR>
Email address: <INPUT TYPE="text" NAME="address" SIZE=30
MAXLENGTH=30>
<BR>
Text:
<BR>
<TEXTAREA ROWS=15 COLS=60 NAME="body"></TEXTAREA>
<BR>
<INPUT TYPE=submit VALUE="POST">
<INPUT TYPE=reset VALUE="CLEAR">
</FORM> </BODY> </HTML>
Beachten Sie den Aufruf des CGI-Skripts im ACTION-Attribut. Das ist der wichtigste Bestandteil des Skripts, weil dem CGI-Skript hier mit Hilfe der Pfadinformation mitgeteilt wird, welche Datei aktualisiert werden soll. Sie könnten den Namen der Gästebuchdatei auch im CGI-Skript kodieren, aber auf diese Weise können Sie mehrere Gästebücher verwenden, die mit Hilfe eines einzigen CGI-Skripts aktualisiert werden können. Hier noch einmal die ACTION-Zeile:
ACTION="/cgi-bin/guestbook.cgi/lemay/examples/guestbook.html">
Der erste Teil dieser Zeile enthält den Aufruf des Skripts (hier /cgi-bin/guestbook.cgi). Auf diese Weise würden Sie jedes beliebige CGI-Skript aus einem ACTION-Attribut heraus aufrufen. Sie werden diesen Teil umändern müssen, so daß er auf guestbook.cgi zeigt, wo auch immer Sie es auf Ihrem Server installiert haben. Die restliche Zeile enthält den Pfad für die eigentliche Gästebuchdatei, wie sie im URL erscheint. Das ist sehr wichtig. Die Pfadinformation, die an den Skriptnamen angehängt wird, ist nämlich nicht der wirkliche Pfad-Name der Datei. Vielmehr handelt es sich um das URL, wobei das http: und der Hostname entfernt werden. Wenn das URL für Ihr Gästebuch so aussieht:
http://myhost/mypages/stuff/guestbook.html
dann lautet der Teil daraus, der an den Skriptnamen angehängt wird:
/mypages/stuff/guestbook.html
Ist das URL gleich
http://myhost/~myname/stuff/guestbook.html
dann wird an die Datei das Folgende angehängt:
/~myname/stuff/guestbook.html
Vergessen Sie den anführenden Schrägstrich nicht, wenn Sie in Ihrem URL eine Tilde (~) verwenden. Er ist wichtig! |
Es gibt noch etwas, das Sie bei der Installation dieser HTML-Datei auf Ihrem System wissen sollten: So wie bei den temporären Dateien im ersten Beispiel, muß es dem Benutzer Nobody möglich sein, in die Datei zu schreiben, so daß das CGI-Skript die Einträge hinzufügen kann. Das bedeutet, daß Sie für die HTML-Datei allen Schreibrechte gewähren müssen.
Das Skript
Nun wollen wir das Skript betrachten. Es ist komplizierter als die bisher in diesem Abschnitt betrachteten Skripte, deshalb soll es zeilenweise erklärt werden.
Wir beginnen mit dem Standard-Perl-Code für die Decodierung von Daten und die Ausgabe des ersten Teils der HTML-Antwort:
#!/usr/local/bin/perl
require 'cgi-lib.pl';
&ReadParse(*in);
print "Content-type: text/html\n\n";
print "<HTML><HEAD>\n";
print "<TITLE>Post Results</TITLE>\n";
print "</HEAD><BODY>\n";
Das guestbook-Skript fügt in jeden Eintrag ein Datum ein. Deshalb holen sich die beiden folgenden Zeilen das aktuelle Datum und schneiden am Ende die Neuzeile ab. Die Variable $date enthält jetzt das Datum:
$date = 'date';
chop($date); # trim \n
In diesem Abschnitt ermittelt das CGI-Skript, wo sich die HTML-Datei befindet, in die es schreiben soll. Wissen Sie noch, daß Sie im ACTION-Teil des Formulars den Pfad für die Datei in das URL aufgenommen haben? Dieser Pfad wird in die CGI-Umgebungsvariable PATH_INFO geschrieben. Der Server übersetzt ihn in einen echten Dateisystem-Pfad-Namen und schreibt diesen Wert in die Umgebungsvariable PATH_TRANSLATED. Mit Hilfe des Werts von PATH_TRANSLATED kann das CGI-Skript feststellen, in welche Datei es schreiben soll:
$file = "$ENV{'PATH_TRANSLATED'}";
Außerdem benötigen wir eine temporäre Datei, um die Originaldatei im Fehlerfall nicht zu zerstören. Die temporäre Datei soll eindeutig (aber nicht zu eindeutig) sein. Warum? Wenn zwei Leute gleichzeitig etwas in das Gästebuch eintragen, dann wollen Sie doch nicht, daß sie gegenseitig ihre Einträge auslöschen. Man kann nicht einfach nur die Prozeß-ID an die temporäre Datei anhängen (wie wir es im ersten Skript gemacht haben): Das ist zu eindeutig! Statt dessen werden wir eine temporäre Datei (in /tmp) außerhalb des Pfads zum eigentlichen Gästebuch erzeugen, indem wir einfach alle Schrägstriche im Pfad durch Klammeraffen (@) ersetzen. Das ist ziemlich verrückt, aber wir erhalten damit eine einzelne temporäre Datei für jede Gästebuchdatei, und genau das wollten wir:
$tmp =
"$ENV{'PATH_TRANSLATED'}.tmp";
$tmp =~ s/\//@/g; # make a unique tmp file name from the path
$tmp = "/tmp/$tmp";
Jetzt wollen wir die Eingaben aus dem Formular auswerten. Zuerst überprüfen wir, ob der Leser in alle Felder etwas eingetragen hat. Wenn das nicht der Fall ist, geben wir eine Fehlermeldung aus. Beachten Sie, daß &err ein Aufruf einer Perl-Unterroutine für die Fehlerausgabe ist. Die Definition dieser Unterroutine finden Sie am Ende des Skripts. Jetzt sollten Sie nur zur Kenntnis nehmen, daß sie existiert.
if ( !$in{'name'} || !$in{'address'} ||
!$in{'body'}) {
&err("You haven't filled in all the fields.
Back up and try again.");
}
Der Rumpf des Eintrags (der Teil, der sich im Textbereich des Formulars befand) muß neu formatiert werden. Insbesondere wenn der Leser die Eingabe in einzelne Abschnitte untergliedert hat, sollten Sie diese (zwei Neue-Zeile-Zeichen in einer Zeile) jeweils durch ein Abschnitt-Tag ersetzen, so daß HTML sie erkennt. Dadurch erhalten wir möglicherweise mehrere <P>-Tags. Deshalb entfernt die letzte Zeile alle Duplikate:
$text = $in{'body'};
$text =~ s/\r/ /g;
$text =~ s/\n\n/<P>/g;
$text =~ s/\n/ /g;
$text =~ s/<P><P>/<P>/g;
Jetzt können wir mit der Aktualisierung des Gästebuchs beginnen. Zuerst versuchen wir, die zuvor benannte temporäre Datei zu öffnen. Erinnern Sie sich an den Hinweis, daß die temporäre Datei nicht zu eindeutig sein darf? Hier werden Sie verstehen, warum. Bevor das Skript die temporäre Datei öffnet, prüft es, ob es bereits eine solche gibt. Wenn ja, dann erfolgt gerade ein anderer Eintrag in das Gästebuch, und wir müssen warten. Wir warten eine bestimmte Zeit lang. Wenn es zu lange dauert, nehmen wir an, es sei etwas schiefgelaufen, und beenden die Operation. Verstanden? Hier der Code:
for($count = 0; -f "$tmp";
$count++) {
sleep(1);
&err("Tmp file in use, giving up!") if ($count > 4); }
Wenn die temporäre Datei noch nicht existiert, können wir sie öffnen, ebenso wie die Original-Gästebuchdatei. Damit können wir aus der Originaldatei lesen und in die temporäre Datei schreiben. Kann die Datei nicht geöffnet werden, wird in jedem Fall ein Fehler erzeugt, wie der folgende Code zeigt:
open(TMP,">$tmp") ||
&err("Can't open tmp file.");
open(FILE,"<$file") || &err("Can't open file $file: $!");
Die Dateien sind offen. Jetzt können wir den Inhalt aus dem Original zeilenweise in die temporäre Datei kopieren. Dabei prüfen wir für jede Zeile, ob sie einen für uns interessanten Kommentar enthält. Wenn wir beispielsweise den Kommentar LASTDATE finden, geben wir ihn aus, gefolgt von dem aktuellen Datum (es wurde am Skriptanfang gesetzt):
while(<FILE>) {
if (/<!-LASTDATE->/)
{ print TMP "<!-LASTDATE-> $date \n"; }
Wenn wir den Kommentar GUESTBOOK finden, dann handelt es sich wirklich um eine Gästebuchdatei. Das werden wir später noch überprüfen, deshalb setzen wir hier die Variable guestbook:
elsif (/<!-GUESTBOOK->/) {
print TMP "<!-GUESTBOOK->\n";
$guestbook++;
}
Dort, wo wir den Kommentar POINTER finden, wird der neue Eintrag eingefügt. Hier werden mehrere Schritte notwendig:
Und hier der Code:
elsif (/<!-POINTER->/) {
print TMP "<HR>";
print TMP "<B>$in{'name'} \n";
print TMP " <A HREF=mailto:$in{'address'}>
$in{'address'}</A></B>$date\n";
print TMP "<P> $text\n<!-POINTER->\n";
}
Wenn die ausgewertete Zeile keinen speziellen Kommentar enthält, kopieren wir sie einfach nur vom Original in die temporäre Datei.
else { print TMP $_; } # copy lines
}
Jetzt werten wir die guestbook-Variable aus, die wir in der Schleife gesetzt haben. Wenn die Datei den Kommentar GUESTBOOK nicht enthält, war sie keine Gästebuchdatei, und wir beenden unsere Operation hier, ohne die Originaldatei zu aktualisieren.
if (! defined $guestbook)
{ &err("not a Guestbook file!"); }
Schließlich ersetzen wir die alte HTML-Datei durch die neue Version und löschen die temporäre Datei:
open(TMP,"<$tmp") ||
&err("Can't open tmp file.");
open(FILE,">$file") || &err("Can't open file $file: $!");
while(<TMP>) {
print FILE $_;
}
close(FILE);
close(TMP);
unlink "$tmp";
Damit sind wir fast fertig. Wir geben nun noch die restliche HTML-Antwort aus. Beachten Sie, daß sie eine Verknüpfung zum Original-Pfad-Namen des Gästebuchs enthält (wie in der Umgebungsvariablen PATH_INFO angegeben), so daß die Leute noch einmal zurückkommen und das Ergebnis betrachten können:
print "<H1>Thank
you!</H1>";
print "<P>Your comment has been added to the ";
print "<A HREF=$ENV{'PATH_INFO'}>guestbook</A>\n";
print "</BODY></HTML>\n";
1;
Den letzten Teil des Skripts stellt die Unterroutine dar, die gegebenenfalls einen Fehler ausgibt. Ich werde sie hier zeigen, damit Sie sehen, was sie macht:
sub err {
local($msg) = @_;
print "$msg\n";
close FILE;
close TMP;
unlink "$tmp";
print "</BODY></HTML>\n";
exit;
}
Falls ein Fehler zu verarbeiten ist, dann werden im wesentlichen die folgenden Schritte ausgeführt:
Ideen
Warum nur ein Gästebuch? Der hier beschriebene Aufbau könnte auch zu einem Web-basierten Konferenzsystem oder einem Diskussionsforum erweitert werden.
Dieses Gästebuch-Skript wurde ursprünglich für ein größeres HTML-Konferenzsystem namens htmlbbs geschrieben, das Sie in Kapitel 28 noch genauer kennenlernen werden. Wenn der Rahmen zum Hinzufügen individueller Kommentare erst einmal errichtet ist, ist es nicht mehr so schwierig, den Rahmen so zu erweitern, daß er mit mehreren Themen gleichzeitig fertig werden kann.
Zusammenfassung
Im letzten Kapitel haben Sie die technischen Aspekte von CGI kennengelernt, ebenso, wie Sie Ihren Programmen über die CGI-Schnittstelle eine Interaktion mit dem Web-Server und dem Browser ermöglichen können. In diesem Kapitel haben wir vier Beispiele für Formulare und CGI-Skripten beschrieben:
Damit sollten Sie über genügend Grundlagenwissen verfügen, um Ihre eigenen Ideen für Formulare in echte interaktive Web-Präsentationen umsetzen zu können.
Dabei sollten Sie erkennen, daß sich CGI nicht wesentlich von anderen Programmieraufgaben unterscheidet. Mit einem Verständnis für Ihre Ziele und die Erwartung der Anwender ist es ganz leicht, zusätzliche Informationen für den Einsatz Ihres Programms im Web einzufügen.
Alle Beispiele, die Sie in diesem Kapitel erforscht haben, finden Sie auf der CD-ROM und dem Web-Site (englisch) zu diesem Buch (http://www.lne.com/Web/). |
Fragen und Antworten
Frage:
Mir gefallen die Seiten, die Zugriffszähler darauf haben, auf denen so etwas ähnliches steht wie: »Sie sind die 15.643. Person, die diese Seite seit dem 14. April besucht hat.« Kann man dies mit einem CGI-Skript tun?
Antwort:
Sie haben schon etwas über Zugriffszähler in Kapitel 15, »Alles online verfügbar machen«, gelernt, und es gab da auch einige Hinweise auf öffentliche Zugriffszähler, die ohne CGI-Skripten funktionieren. Die Antwort auf Ihre tatsächliche Frage - nämlich, ob Sie Zugriffszähler mit Hilfe von CGI-Skripten verwirklichen können - ist Ja, der einfachste Weg dazu besteht jedoch aus etwas, das Server-Includes genannt wird. Sie werden mehr über Server-Includes und darüber, wie Sie damit Zugriffszähler erzeugen können, in Kapitel 27, »Web-Server: Hinweise, Tricks und Tips«, erfahren.
Frage:
Ich kann keines dieser Perl-Beispiele zum Laufen kriegen. Entweder bekomme ich leere Resultate, es werden keinerlei Übereinstimmungen gefunden, oder ich erhalte seltsame Fehler. Was geht hier vor?
Antwort:
Wahrscheinlich haben Sie cgi-lib.pl nicht an der richtigen Stelle. cgi-lib.pl ist eine Perl-Bibliothek und muß als solche bei Ihrer Perl-Installation mit allen anderen Ihrer Perl-Bibliotheken installiert werden, meistens im Verzeichnis /usr/lib.perl. Es in Ihr cgi-bin-Verzeichnis zu stecken, funktioniert nicht - Perl wird nicht in der Lage sein, es zu finden. Sprechen Sie mit Ihrem Web-Master oder Systemverwalter darüber, wie Sie diese Bibliothek an der richtigen Stelle installiert bekommen, so daß Sie diese Skripten ausführen können.
Frage:
Kann man ein CGI-Skript erzeugen, das Formulareingabe zuläßt, mit der man eine große Datenbank so wie Oracle oder Sybase abfragen kann?
Antwort:
Ja, man kann. Aber CGI zu schreiben, das SQL ansprechen kann, ist eine zu komplexe Aufgabe für dieses Buch, so daß ich vorschlage, daß Sie mit Ihrer Datenbank-Firma sprechen oder einen Web-Index nach weiteren Informationen durchsuchen. Kapitel 30, »Verwaltung großer Präsentationen und Sites«, gibt Ihnen ebenfalls noch eingehendere Informationen über Datenbanken und CGI.
Copyright ©1998 by SAMS, einem Imprint
der Markt&Technik Buch- und
Software-Verlag GmbH.
Elektronische Fassung des Titels: HTML 4 in 14 Tagen, ISBN: 3-8272-2019-X