Jörk Behrends: Das is was für cgi-tüftler oder fortgeschrittenen - bitte helft mir!

Beitrag lesen

Hi!

von http://127.0.0.1/cgi-bin/links/add.cgi?language=german

Genau das ist es. Der Standardweg.

halt ich nicht viel, da dem cgi später noch andere daten zugepostet werden, da kommt dann ein durcheinander raus, ausserdem würde die admin.cgi auch nicht mehr funktionieren, denn die bekommt daten in unterschielichster form übermittelt...

Wieso Durcheinander? Wenn die admin.cgi dann nicht mehr funktioniert, solltest Du vielleicht dort etwas feilen, anstatt alles andere daran anzupassen.

Ich denke, daß sich die beiden Varianten nicht so wahnsinnig unterscheiden. Wenn ich mal davon ausgehe, daß der Query-String schon eingelesen ist (oder ich nutze CGI.pm), macht es nicht denn Unterschied im Aufwand, ob ich nun einen Query-Parameter oder eine Umgebungsvariable abfrage. Generische mag die Lösung mit dem Pfad sein, da ich dann wohl am wenigsten mit anderen Werten aus dem Formular kollidiere. Andererseits kann ich einen Sprachwert aus dem Query-String auch im Formular einsetzen, und so den Formularanwender die Möglichkeit geben, die Sprache zu wechseln. Also ... jeder wie er mag!

wie regle ich das am besten mit den formularen?
http://127.0.0.1/cgi-bin/links/add.cgi/german?id=yw&name=abc....
oder so
http://127.0.0.1/cgi-bin/links/add.cgi?id=yw&name=abc..../german

Wenn Du die Fragezeichenversion verwendest, ist es doch alles dasselbe, egal ob per Formular oder direkte URL-Angabe.

Zuerst ist der Pfad (inkl. german) anzugeben. Dann kommt das ? mit den nachfolgenden Parametern.

Ich arbeite zufaellig gerade an einem aehnlichen Problem. Dabei habe ich die Funktion InitQuery gebaut, die den QUERY_STRING in den globalen Hash %query reinparst. Dann kannst Du z.B. mit $query{'language'} drauf zugreifen. Vorsicht! Die hiernach gepostete Funktion habe ich aber modifiziert, um Deinem Problem naeherzukommen; sie ist nicht getestet (nicht mal auf korrekte Syntax).

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.

Gruß,
   Jörk