Achim: Mehjrauswahl bei checkboxen per CGI verarbeiten

Okay, ich bin gerade etwas ratlos... Bei Checkboxen mit dem gleichen internen Namen kann der User ja mehrere Checkboxen auswählen. Wie kann ich diese Werte jetzt per CGI verarbeiten?

Wenn ich die normal auslese bekomme ich immer nur den letzten angeklickten Wert. Muss ich die in ein Array lesen? Wie? Oder werden die per Komma getrennt übertragen?

Steh gerade auf dem Schlauch und bin für jeden Hinweis dankbar!

    1. Danke, aber ich möchte das in ein bestehendes Skript einbauen und deshalb eigentlich weder das CGI-Modul noch PHP benutzen. Das muss doch auch noch anders gehen, oder?

      Normalerweise lese ich die übergebenen Werte immer folgendermaßen aus:

      Abspeichern in der Variable $buffer

      if ($ENV{'REQUEST_METHOD'} eq "GET") {
          $buffer = $ENV{'QUERY_STRING'};
      } else {
          read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
      }

      Aufteilen des Datenstrings in einzelne Teile.

      @nvpairs = split(/&/,$buffer);
      foreach $pair (@nvpairs) {
          # Ich decodiere jedes der Teil
          ($name, $value) = split(/=/, $pair);
          $value =~ tr/+/ /;
          $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
          $in{$name} = $value;
      }

      Variablen auslesen

      $i = $in{'variablename'};

      Wenn ich das mit mehrfachausgewählten Checkboxen mache, bekomme ich wie gesagt immer nur den letzten Wert. Was muss ich ändern?

      1. Hi,

        Danke, aber ich möchte das in ein bestehendes Skript einbauen und deshalb eigentlich weder das CGI-Modul noch PHP benutzen. Das muss doch auch noch anders gehen, oder?

        Ja, aber die Verwendung des CGI-Modules vereinfacht das Ganze.

        $value =~ tr/+/ /;

        Warum packst du hier nicht alles gleich in ein Array:

        @werte = split(/+/,$value);

        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        Vielleicht offenbart sich mir hier wieder mal eine Wissenslücke, aber wieso ersetzt du %nn durch die pack-Anweisung? Da würde doch dann aus "%20" sowas werden "%pack("C", hex($1))", oder? Und was bedeutet "e" als Flag, sicher meinst du "i".

        Also irgendwie blicke ich bei deinen RegEx nicht so ganz durch, das will aber nix heißen ;-)

        Viele Grüße
        Torsten

        --
        Wäre Stoizismus eine Programmiersprache, würde ich ein Experte sein.
        1. Hi,

          $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

          Vielleicht offenbart sich mir hier wieder mal eine Wissenslücke, aber wieso ersetzt du %nn durch die pack-Anweisung? Da würde doch dann aus "%20" sowas werden "%pack("C", hex($1))", oder? Und was bedeutet "e" als Flag, sicher meinst du "i".

          e als Flag heisst, dass der Ausdruck auf der rechten Seite der Ersetzung als Code ausgeführt wird (*E*val). Darum ersetzt er das auch nicht mit "pack(...)" sondern mit dem entsprechenden Rückgabewert von pack.

          wunderwarzenschwein

          --
          ss:} zu:$ ls:} fo:| de:] va:) ch:? sh:( n4:# rl:? br:> js:| ie:( fl:{ mo:)
          1. Hi,

            e als Flag heisst, dass der Ausdruck auf der rechten Seite der Ersetzung als Code ausgeführt wird (*E*val). Darum ersetzt er das auch nicht mit "pack(...)" sondern mit dem entsprechenden Rückgabewert von pack.

            Danke :)

            Viele Grüße
            Torsten

            --
            Wäre Stoizismus eine Programmiersprache, würde ich ein Experte sein.
      2. Danke, aber ich möchte das in ein bestehendes Skript einbauen und deshalb eigentlich weder das CGI-Modul noch PHP benutzen. Das muss doch auch noch anders gehen, oder?

        Normalerweise lese ich die übergebenen Werte immer folgendermaßen aus:

        Das CGI Modul nicht zu verwenden ist ein großer Fehler. Da damit nicht nur das jetzige Problem gelöst werden würde, sondern du darüber hinaus etliche sinnvolle Funktionen (die du wahrscheinlich alle versuchst selber zu schreiben), wie z.b. zur generierung von HTML Formularen und Tabellen, zur Hand bekommst.

        Struppi.

      3. hi,

        ersetze mal
          $in{$name} = $value;
        durch
           $in{$name} .= $value . "\x00";
        dann kannst Du mit

        for (split(/\x00/,$in{'checkboxname'}){
          print $_;
        }

        die Liste abarbeiten

        Grüße Oesi

  1. Hi,

    Okay, ich bin gerade etwas ratlos... Bei Checkboxen mit dem gleichen internen Namen kann der User ja mehrere Checkboxen auswählen.

    Wieso nur, wenn sie die gleichen Namen haben? Würde in deinem Formular bspw. folgendes stehen:

    <input type="checkbox" name="cb1" value="1"> Checkbox 1<br>
    <input type="checkbox" name="cb2" value="1"> Checkbox 2<br>
    <input type="checkbox" name="cb3" value="1"> Checkbox 3<br>

    kannst du alle drei Boxen auswählen oder nur zwei, eine oder gar keine. Es wird/werden dann nur das/die Pärchen "name=value" an dein Script übermittelt, das/die geklickt war/waren.

    Wie kann ich diese Werte jetzt per CGI verarbeiten?

    Wenn du Perl nutzt, schau dir mal die Erläuterungen zum CGI-Modul an.

    Viele Grüße
    Torsten

    --
    Wäre Stoizismus eine Programmiersprache, würde ich ein Experte sein.