Stephan: Einlesen einer URL

Hi,

da ich eigentlich noch keine Ahnung von CGI hab, brauche ich mal Hilfe:

Ich möchte über die URL "http://www.domain.de/cgi-bin/script.cgi?wert1=312&wert2=154&wert3=4864"

Eine HTML Datei, in der die Werte stehen ausgeben lassen.

dass ich so die datei in den Browser kriege, weiß ich:

print "Content-type: text/html\n\n";
   print "<html>\n";
   print "<head>\n";
   print "<title>CGI Test</title>\n";
   print "</head>\n";
   print "<body>\n";
   print "Wert 1: $wert1<br>\n";
   print "Wert 2: $wert2<br>\n";
   print "Wert 3: $wert3<br>\n";
   print "</body></html>\n";

aber wie schaffe ich es, die Daten in das Script einzulesen?

Für jede Hilfe dankbar
Stephan

  1. Ich möchte über die URL "http://www.domain.de/cgi-bin/script.cgi?wert1=312&wert2=154&wert3=4864"
    Eine HTML Datei, in der die Werte stehen ausgeben lassen.

    Dazu gibt es Umgebungsvariablen, hier die Variable $QUERY_STRING. Bau mal folgendes in dein Script ein:

    $Wertestring = $ENV{'QUERY_STRING'};
    @Wertepaare = split(/&/, $Wertestring);
    foreach $Paar (@Wertepaare) {
          ($Name, $Wert) = split(/=/, $Paar);
          $PARAM{$Name} = $Wert;
    }

    Damit liest du die Daten hinter dem Fragezeichen zunaechst in die Variable $Wertestring ein. Dann droeselst du sie nach dem Schema, dass mit & und = gesetzt wird, auf. Dabei entsteht ein Hash namens PARAM, ueber den du anschliesend Zugriff auf die einzelnen Parameter und ihre Werte hast. Bei der Ausgabe kann das dann so aussehen:

    print "Content-type: text/html\n\n";
    print "<html>\n";
    print "<head>\n";
    print "<title>CGI Test</title>\n";
    print "</head>\n";
    print "<body>\n";
    print "Wert 1: $PARAM{'$wert1'}<br>\n";
    print "Wert 2: $PARAM{'$wert2'}<br>\n";
    print "Wert 3: $PARAM{'$wert3'}\n";
    print "</body></html>\n";

    viele Gruesse
      Stefan Muenz

    1. Hallo,

      dann sieht meine datei also so aus:

      $Wertestring = $ENV{'QUERY_STRING'};
      @Wertepaare = split(/&/, $Wertestring);
      foreach $Paar (@Wertepaare) {
            ($Name, $Wert) = split(/=/, $Paar);
            $PARAM{$Name} = $Wert;
      }

      print "Content-type: text/html\n\n";
      print "<html>\n";
      print "<head>\n";
      print "<title>CGI Test</title>\n";
      print "</head>\n";
      print "<body>\n";
      print "Wert 1: $PARAM{'$wert1'}<br>\n";
      print "Wert 2: $PARAM{'$wert2'}<br>\n";
      print "Wert 3: $PARAM{'$wert3'}\n";
      print "</body></html>\n";

      wenn ich nun http://localhost/script.cgi?wert1=110&wert2=112&wert3=123 aufrufe, bekomme ich das angezeigt (Quelltext):

      <html>
      <head>
      <title>CGI Test</title>
      </head>
      <body>
      Wert 1: <br>
      Wert 2: <br>
      Wert 3:
      </body></html>

      Was hab ich noch falsch gemacht?

      Stephan

      1. Hallo Stephan,

        auf den ersten Blick fällt mir dieser Verbesserungsvorschlag ein:

        print 'Wert 1: '.$PARAM{'wert1'}."<br>\n";
        print 'Wert 2: '.$PARAM{'wert2'}."<br>\n";
        print 'Wert 3: '.$PARAM{'wert3'}."\n";

        Und ansonsten lies mal etwas in der Perl Doku herum (-:

        CYa
        GONZO

      2. Hallo Stephan,

        Was hab ich noch falsch gemacht?

        Mit Grundsaetzlichem zu CGI und Perl hast du dich beschaeftigt (z.B. <../../tgb.htm>)?
        Du weisst, dass CGI-Scripts in ein fuer den Web-Server definiertes CGI-Verzeichnis gehoeren und in der Regel nicht einfach in der document root abgelegt werden, so wie es dein Aufruf (http://localhost/script.cgi?wert1=110&wert2=112&wert3=123) vermuten laesst?
        Und du rufst das Script auch durch Eingabe der URL im Browser auf und nicht irgendwie ueber Kommandozeile oder so was?

        viele Gruesse
          Stefan Muenz

        1. Hallo Stephan,

          Was hab ich noch falsch gemacht?

          Mit Grundsaetzlichem zu CGI und Perl hast du dich beschaeftigt (z.B. <../../tgb.htm>)?

          jap

          Du weisst, dass CGI-Scripts in ein fuer den Web-Server definiertes CGI-Verzeichnis gehoeren und in der Regel nicht einfach in der document root abgelegt werden, so wie es dein Aufruf (http://localhost/script.cgi?wert1=110&wert2=112&wert3=123) vermuten laesst?

          doch, das geht, wenn ich die werte nämlich über ein anderes script per formular eingebe, klappts

          Und du rufst das Script auch durch Eingabe der URL im Browser auf und nicht irgendwie ueber Kommandozeile oder so was?

          klar - das ganze geht über onmi httpd

          viele Gruesse
            Stefan Muenz

      3. Hi Stephan

        print "Content-type: text/html\n\n";
        print "<html>\n";
        print "<head>\n";
        print "<title>CGI Test</title>\n";
        print "</head>\n";
        print "<body>\n";
        print "Wert 1: $PARAM{'$wert1'}
        \n";
        print "Wert 2: $PARAM{'$wert2'}
        \n";
        print "Wert 3: $PARAM{'$wert3'}\n";
        print "</body></html>\n";

        Nur ein kleiner Fehler ist drin. Das ganze muß ohne das $-Zeichen gemacht werden.
        $PARAM{'wert1'}
        dann klappts.

        Cu Uwe

      4. ($Name, $Wert) = split(/=/, $Paar);

        ....

        print "Wert 1: $PARAM{'$wert1'}

        ...

        Was hab ich noch falsch gemacht?

        perl unterscheidet zwischen GROSS und kleinschreibung, oder?

        $Wert und $wert sollten was anderes sein. bzw $wert sollte undefiniert / der leerstring sein.

    2. Dazu gibt es Umgebungsvariablen, hier die Variable $QUERY_STRING. Bau mal folgendes in dein Script ein:

      $Wertestring = $ENV{'QUERY_STRING'};
      @Wertepaare = split(/&/, $Wertestring);
      foreach $Paar (@Wertepaare) {
            ($Name, $Wert) = split(/=/, $Paar);
            $PARAM{$Name} = $Wert;
      }

      Ohje! Es empfiehlt sich wirklich nicht, Anfängern derart mit heißer Nadel grob Gestricktes zu empfehlen. Diese vorgeschlagene Methode läßt die Kodierung der Formularergebnisse völlig außer Acht.

      Soetwas loest man _natürlich_ mit CGI.pm.

      cu,
      Peter