Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungFormulare Dekodieren Codieren CGI CGI-Skripte Decodieren Kodieren Daten der Formulare dekodieren - Der Algorithmus GGI Kurs Kapitel 7

Daten der Formulare dekodieren - Der Algorithmus           zurück zum Inhaltsverzeichnis

Im Kapitel zuvor haben Sie erfahren, wie Sie mit Hilfe von Formularen Daten an ein CGI-Skript schicken können. Wenn Sie nun Beispielsweise bei folgendem Formular, folgendes abschicken würden ...

Name :
EMail:
Hobby:

Folgende Daten werden nun über den Web-Server an das CGI-Skript übertragen ...

name=J%F6rg+Wolf&e-mail=joerg%40pronix.de&hobby=pc+%28Programmieren%29

Dabei handelt es sich um codierte Daten. Hierzu ein Überblick, was die einzelnen Zeichen dabei für einen Bedeutung haben ...

Jetzt wollen Sie natürlich auch wissen, wie Sie das alles in der Praxis dekodieren können. In folgende einzelne Teile müssen wir unsere Funktion aufteilen ...

  1. Mit welcher Methode wurden uns die Daten geschickt. Bei der GET-Methode müssen wir den Query-String auslesen. Bei der POST-Methode müssen wir Content length Bytes aus der Standardeingabe (STDIN) einlesen.
  2. Die einzelnen Namen/Werte-Paare anhand des Zeichen '&' aufteilen.
  3. Namen und Werte anhand des Zeichens '=' teilen.
  4. Codierte Zeichen (Prozentzeichen, gefolgt von zwei Hexzahlen) dekodieren.
  5. Namen und Werte zuweisen.

Nun wollen wir uns die entsprechende Funktion in Perl dazu ansehen ...

sub dekodieren{
  my %formular;
  my @paar;
#Bei Methode GET die einzelnen Namen/Werte-Paare aus dem QUERY_STRING lesen
#die einzelnen Namen/Werte-Paare werden anhand des Zeichens '&' getrennt
  if($ENV{REQUEST_METHOD} eq 'GET'){
     @paar = split(/&/, $ENV{QUERY_STRING});
   }
#Bei der POST-Methode CONTENT_LENGTH Bytes aus STDIN lesen
#die einzelnen Namen/Werte-Paare werden anhand des Zeichens '&' getrennt
  if($ENV{REQUEST_METHOD} eq 'POST'){
     my $q;
     read( STDIN, $q, $ENV{CONTENT_LENGTH} );
     push @paar, split( /&/, $q );
   }
#Als nächstes wird jeweils das Name/Wert-Paar anhand des Zeichens '=' getrennt
foreach(@paar){                   #alles in $_
  my( $name, $wert) = split(/=/);
#Jetzt werden die Leerzeichen dekodiert '+' (ersetzt)
$name =~tr/+/ /;
#Aus der Hexdezimaldarstellung müssen wir nun eine ASCII-Darstellung machen
#dies machen wir mit Hilfe eines Pattern Matching-Ausdrucks
$name =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
#dasselben wird nun auch mit dem Wert gemacht ...
$wert = "" unless defined $wert;
$wert =~tr/+/ /;
$wert =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

$formular{$name} = $wert;
  }
return %formular;
}

Aufrufen können Sie nun diese universelle Funktion, mit folgendem Funktionsaufruf ...

my %query=dekodieren();

Hierzu wollen wir uns nochmals das Formular von zuvor ansehen, welches Sie diesesmal testen können, wenn Sie wollen ...

Name :
EMail:
Hobby:

Der Quelltext zu diesem Formular sieht folgendermaßen aus ...

<form target="_blank" action="../../cgi-bin/dekodieren.cgi" method="POST">
<tt>Name : <input type="Text" name="name" value="" size="25" maxlength="25"><br>
EMail: <input type="Text" name="e-mail" value="" size="25" maxlength="25"><br>
Hobby: <input type="Text" name="hobby" value="" size="25" maxlength="25"><br><br>
<input type="Submit" name="sub" value="Abschicken"></tt></form>

Und jetzt noch der Quelltext des CGI-Skripts, welches dieses Formular auswertet ...

#!/usr/bin/perl -w

use strict;

my %query=dekodieren();

print "Content-type: text/html\n\n";
print "<html><head><title>Dekodieren eines Formulars</title><body>";
print "<p>Ihr Name: $query{'name'}  <p>E-mail: $query{'e-mail'}";
print "<p>Ihr Hobby: $query{'hobby'}</body></head></html>";

sub dekodieren{
  my %formular;
  my @paar;
#Bei Methode GET die einzelnen Namen/Werte-Paare aus dem QUERY_STRING lesen
#die einzelnen Namen/Werte-Paare werden anhand des Zeichens '&' getrennt
  if($ENV{REQUEST_METHOD} eq 'GET'){
     @paar = split(/&/, $ENV{QUERY_STRING});
   }
#Bei der POST-Methode CONTENT_LENGTH Bytes aus STDIN lesen
#die einzelnen Namen/Werte-Paare werden anhand des Zeichens '&' getrennt
  if($ENV{REQUEST_METHOD} eq 'POST'){
     my $q;
     read( STDIN, $q, $ENV{CONTENT_LENGTH} );
     push @paar, split( /&/, $q );
   }
#Als nächstes wird jeweils das Name/Wert-Paar anhand des Zeichens '=' getrennt
foreach(@paar){                   #alles in $_
  my( $name, $wert) = split(/=/);
#Jetzt werden die Leerzeichen dekodiert '+' (ersetzt)
$name =~tr/+/ /;
#Aus der Hexdezimaldarstellung müssen wir nun eine ASCII-Darstellung machen
#dies machen wir mit Hilfe eines Pattern Matching-Ausdrucks
$name =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
#dasselben wird nun auch mit dem Wert gemacht ...
$wert = "" unless defined $wert;
$wert =~tr/+/ /;
$wert =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

$formular{$name} = $wert;
  }
return %formular;
}

Ausgeben können Sie die einzelnen Elemente des Formulars mit Hilfe eines Hash, wie hier geschehen mittels ...

$query{'name'}
$query{'e-mail'}
$query{'hobby'}

Nachdem Sie nun wissen, wie man codierte Daten dekodiert, steht Ihnen nun eigentlich nichts mehr im Wege eigene CGI-Skripte zu schreiben. Natürlich stellt dieses Beispiel nicht das nonplus-ultra da. Denn dieses Skript unterstützt zum Beispiel keine Mehrfachauswahl (sofern Sie dies verwenden), wie dies mit Scroll-Listen gemacht werden kann. Aber anstatt sich nun den Kopf zu zermattern, wie Sie dies in Ihr Skript einbauen können, empfiehlt es sich erst mal das CGI.pm Modul anzusehen.