Calocybe: Das is was für cgi-tüftler oder fortgeschrittenen - bitte helft mir!

Beitrag lesen

Hi!

sub InitQuery() {
    my @args;
    my ($field, $value);

%query = ();

@args = split(/&/, $ENV{'QUERY_STRING'});
    for (@args) {
        $_ =~ s/%3D/=/gi;           # aeltere Browser uebergeben unter Umstaenden %3D statt =
        ($field, $value) = split(/=/, $_);
        $value =~ s/+/ /g;               # + durch Leerzeichen ersetzen
        $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/ge;         # Hexa-Angaben -> echte Zeichen
        $query{$field} = $value;
    }
}

Du solltest insbesondere testen, was passiert, wenn die uebergebenen Daten (was halt im Formular eingegeben wurde) selbst ein oder mehrere = enthalten. Please post any results in this forum. Wenn Du trotzdem lieber die add.cgi/german -Variante bevorzugst, denn schau mal in den beiden letzten Archiv-Dateien, vor kurzem hatte glaube ich mal jemand was dazu geschrieben.

Ein = in den Parametern macht doch kein Problem, da dieses innerhalb des Query-Stings durch den Hexwert kodiert ist. Das Programm splittet ja auch erst am = und ersetzt dann alle Hexangaben durch die entsprechenden Zeichen (z.B. das =). Für die Kodierung der Eingaben ist im übrigen der Browser zuständig.

Vergiss nicht die Zeile   $_ =~ s/%3D/=/gi; ! Sie wandelt noch vor dem split() alle als %3D uebergebenen = in ein richtiges = um. Ich habe das gamacht, weil ich es mit MS IE 3 schon erlebt habe, dass er, falls man das Script mit einer HREF aufruft, eben das = als zum Dateinamen zugehoerig betrachtet und daher in das %3D umgewandelt hat. Das Problem, das ich jetzt bei dieser Zeile vermutet habe, ist: Beinhaltet der Wert (das was hinter dem = steht) seinerseits auch ein =, kommen demnach also mehrere %3D's im $_ vor, werden nach dieser Zeile wieder mehrere = dort stehen, und es ist zu befuerchten, das split() auf die Schnauze faellt (ich weiss ja nicht, wie es ganz genau arbeitet); es muesste in diesem Fall ja mehr als nur zwei Skalare zurueckliefern. Inzwischen ist mir aber ne ganze billige Abhilfe fuer das Problem eingefallen: Lasse das g als Option weg, also nur
$_ =~ s/%3D/=/i;   dann wird nur das erste Auftreten von %3D ersetzt und alles sollte in Butter sein (denk ich jetzt mal).

(Hoffentlich nicht zu kompliziert formuliert),
Calocybe