Wie kann ich Parameter aus einem Formular auslesen?
(
Autor: Darkmage & perl-community, Relais)
Hierfür gibt es 2 sinnvolle und populäre Methoden
Zunächst einmal, um die Situation zu verstehen, soll erklärt werden wie die
Formulardaten mit ihren ganzen Eingabefeldern, Radiobuttons, Uploadfeldern
etc. eigentlich zum Server gelangen.
Hierbei unterscheidet man 2 Methoden:
* GET: Bei dieser Methode werden die Daten zunächst an den Server gesendet, welcher
dann die Daten an das Script weiterleitet. Diese Daten werden dazu an den
sogenannten Query String angehangen, getrennt durch ein Fragezeichen.
Darum erkennt man die Get Methode an einer solchen Adresse:
http://www.server.com/cgi-bin/script.cgi?zahl1=329&zahl2=382&name=foo
Pro: Bei dieser Methode können die vom Script ausgegebenen Seiten als Favorit
gespeichert oder als Link weitergegeben bzw. in einem <a href> eingebungen werden.
Der Aufrufende gelangt damit immer auf die richtige Seite.
Kontra: Die Länge des Get-Strings ist von Browser zu Browser verschieden begrenzt,
zudem werden evtl. sensitive Daten auch in der History des Browsers gespeichert.
* POST: Bei dieser Methoden werden die Daten direkt an das Script gesendet, welches
im action des <form> Tags festgelegt wird.
Pro: Die Menge der Daten ist quasi unbeschränkt und auch ein Upload von Dateien
ist über diese Methode möglich. Zudem werden sensitive Daten, da nicht an den
URL angehangen, nicht in der Browserhistory gespeichert.
Kontra: Keine Verlinkung zu POST Ausgaben möglich
Beide Methoden haben ihre Daseinsberechtigung und zu sagen "Diese Methode ist besser"
wäre falsch. Sie als Programmierer müssen entscheiden, in welchem Fall welche Methode
am besten ist. Nehmen wir dazu als Beispiel ein Forum, welches völlig CGI basiert ist:
Beiträge eintragen per POST um die Größenbeschränkungen der Browser zu umgehen, die Daten
nicht in der Browserhistory zu offenbaren und User daran zu hindern, einen Repost über
einen einfachen Reload der Seite vorzunehmen. (Bei POST erscheint eine entsprechende Warnung)
Beiträge lesen per GET, um so einen Link zu dem Beitrag in anderen Beiträgen posten zu können.
Nun aber zu den eigentlichen Möglichkeiten, wie man die Inhalte bestimmter Formularfelder
ausliest und für sein Programm nutzbar macht. Ich werde nicht erklären, wie man ein Formular
aufbaut, nähere Informationen hierzu in
SelfHTML? - siehe Ende des Textes.
1. Methode "CGI.pm objektorientiert"
Das CGI Modul, welches mit perl 5004 das erste Mal zur
Standarddistribution gehörte und seitdem aus nicht wegzudenken
ist die sichere Methode.
Der Umgang mit CGI.pm ist sehr einfach,
das Auslesen erfolgt über die Funktion param, welche vom Modul
bereitgestellt wird. Hier ein kleines Beispiel - wir wollen den
Inhalt des Textfeldes test im Skalar $formTest speichern:
Wem mehr an OOP liegt kann auch dies tun:
use CGI;
my $form = CGI::->new;
my $form_test = $form->param('test');
Und fertig.
2. Methode "CGI.pm ohne oo"
use CGI qw(:standard);
my $form_test = param('test');
Und fertig.
Welche Methode sie letztendlich nutzen liegt ganz bei Ihnen. Ich persönlich empfehle Ihnen
jedoch CGI.pm. Es ist aktuell, zuverlässig, einfacher und übersichtlicher als alle zuvor
genannten Methoden.
3. Methode "cgi-lib.pl"
Im Netz tummelt sich, insbesondere in alten Scripten
immer noch das cgi-lib.pl, welches mit require eingebunden wird
und Funktionen liefert, welche auch die Aufgabe verrichten.
Jedoch ist cgi-lib.pl mittlerweile angegraut, wird nicht
mehr aktualisiert und gehört zu den Überresten von perl4.
perldoc CGI (CGI Manpage)
http://www.google.de/custom?hl=de&ie=ISO-8859-1&domains=www.perldoc.com&sitesearch=www.perldoc.com&q=CGI&btnG=%3E (Google Perldoc.com: CGI)
http://search.cpan.org/search?query=CGI&mode=module (CPAN: CGI)
http://www.teamone.de/selfhtml/tch.htm (SelfHTML? - Formulare)
http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm (Deutsche Übersetzung)
http://www.linux-magazin.de/ausgabe/1998/03/CGI/cgi1.html (Interessante Artikel zu CGI)
http://www.linux-magazin.de/ausgabe/1998/03/CGI/cgi2.html (dito)
http://www.linux-magazin.de/ausgabe/1998/03/CGI/cgi3.html (dito)
http://www.linux-magazin.de/ausgabe/1998/03/CGI/cgi4.html (dito)
Ergänzungen, Kommentare
Parameter in ein Hash lesen
Mit CGI.pm kann man noch einfacher die Parameter auslesen. Mit der oben genannten Methode braucht man für jedes Formularfeld eine eigene Variable. Bei 20 Feldern würde 20 mal
my $variable = param('Feldname');
stehen. Das ist umständlich und schlecht zu warten.
Man kann sich mit CGI.pm das Leben aber sehr vereinfachen. Man liest alles in ein Hash ein.
my $cgi = CGI->new();
my %formulardaten = $cgi->Vars();
Als Schlüssel des Hashs dienen die Feldnamen aus dem Formular und die Values sind die Benutzereingaben. Wenn man also wissen möchte, was der Benutzer in das Feld 'dateiname' eingetragen hat, so macht man einfach:
print $formulardaten{dateiname};
ReneeBaecker 08.09.2004
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden:
---### Main.??? - 14 Jul 2003 - Betreff