Florian: CGI Script funktioniert nicht.

Hallo
Ich habe ein CGI script dass Formulareingaben in eine Datei speichern sollte. Leider Funktioniert es nicht mehr (liegt bestimmt daran dass ich ein blutiger Anfänger bin). Könnte es jemand für mich Funktionsfähig machen?

Das Script sollte überprüfen ob die beiden Passwörter übereinstimmen - wenn nicht soll keine Eintragung in der txt datei vorgenommen werden und es soll dem Besucher angegeben werden dass die passwörter nicht übereinstimmen.

Wenn es möglich ist sollte das script auch Überprüfen ob der name schon mal benutzt wurde wenn ja - keine Eintragung mit Ausgabehinweiß dass der Name bereits belegt ist.

Vielen Dank im vorraus.

#!/usr/bin/perl
$datfile="eingabe.txt";
print "Content-type: text/html\n\n";
####### Formulardaten einlesen ###################
use CGI;
$cgi->param("name");
$cgi->param("mitteilung");
$cgi->param("passwort");
$cgi->param("passwort2");

if ($pw != $pwst) {
print "<html><head><title>FEHLER</title></head>\n";
print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
print "<br><br>\n";
print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
};

print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
print "<br><br>\n";
     print "Ihr Name                 = $name <br>\n";
     print "Ihre Mitteilung          = $mitteilung <br>\n";
     print "Ihr Passwort             = $passwort <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";

if ($action eq "start") {&start;}

open(DATA,">>$datfile");
      print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
      close(DATA);

sub start {
   open(INDEX,"$datfile");
            @index = <INDEX>;
            close(INDEX);
            foreach (@index)       {
                        $dzeil =$_;
                  chomp($dzeil);

($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
     print "Ihr Name                 = $name\n";
     print "Ihre Mitteilung          = $mitteilung\n";
     print "Ihr Passwort             = $passwort\n";
     print "Ihre Passwortbestätigung = $passwort2\n";
     exit;
     }
     }

  1. Hallo
    Ich habe ein CGI script dass Formulareingaben in eine Datei speichern sollte. Leider Funktioniert es nicht mehr (liegt bestimmt daran dass ich ein blutiger Anfänger bin). Könnte es jemand für mich Funktionsfähig machen?

    was funktioniert denn nicht mehr, bzw. welche fehlermeldung kriegst du vom server?

    if ($pw != $pwst) {

    woher kriegst du den wert $pwst?

    rok°!

    1. also
      ich bekomme gar keine Fehlermeldung und die daten werden nicht eingetragen.
      einfach White screen im explorer

      außerdem habe ich das jetzt so umgeändert:

      #!/usr/bin/perl
      $datfile="mitteilung.txt";
      print "Content-type: text/html\n\n";
      ####### Formulardaten einlesen ###################
      my $cgi = new CGI;   # OOP!!!
      use CGI;
      use strict;
      my $name = $cgi->param("vuname");
      my $vhost = $cgi->param("vhost");
      my $passwort = $cgi->param("pw");
      my $passwort2 = $cgi->param("pwueb");

      der rest unten ist noch gleich

  2. Halihallo

    Ich habe ein CGI script dass Formulareingaben in eine Datei speichern sollte. Leider Funktioniert es nicht mehr (liegt bestimmt daran dass ich ein blutiger Anfänger bin). Könnte es jemand für mich Funktionsfähig machen?

    Also, es ist ein perl Script und nicht ein CGI script. CGI ist nur eine "Vorschrift"/Interface/Schnittstelle, wie der Webserver die Daten an das Programm zu übergeben hat. Dies mal hierzu ;)

    Hast du ein perl lokal installiert? - Dann würde es dir sehr schnell den Fehler sagen, nämlich, dass $cgi nicht definiert ist!

    use CGI;

    my $cgi = new CGI;   # OOP!!!

    hier war der Fehler! Diese Zeile musst du einfügen!

    my $bla = $cgi->param("WhatEver");

    und: bitte use strict; verwenden, ja?
    Ich habe auch ohne "use strict" begonnen und habe erst spät dessen Vorzüge kennengelernt. Mach dir zu liebe nicht den selben Fehler!

    Viele Grüsse

    Philipp

  3. also:
    Durch die Hilfe von Philipp sieht jetzt mein script so aus:

    #!/usr/bin/perl
    $datfile="mitteilung.txt";
    print "Content-type: text/html\n\n";
    ####### Formulardaten einlesen ###################
    my $cgi = new CGI;   # OOP!!!
    use CGI;
    use strict;
    my $name = $cgi->param("vuname");
    my $mitteilung = $cgi->param("mitteilung");
    my $passwort = $cgi->param("pw");
    my $passwort2 = $cgi->param("pwst");
    my $email = $cgi->param("email");

    if ($pw != $pwueb) {
    print "<html><head><title>FEHLER</title></head>\n";
    print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
    print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
    print "<br><br>\n";
    print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
    print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
    };

    print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
    print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
    print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
    print "<br><br>\n";
         print "Ihr Name                 = $name <br>\n";
         print "Ihre Mitteilung          = $mitteilung <br>\n";
         print "Ihr Passwort             = $passwort <br>\n";
         print "Ihre E-Mail adresse      = $email <br>\n";
    print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";

    if ($action eq "start") {&start;}

    open(DATA,">>$datfile");
          print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
          close(DATA);

    sub start {
       open(INDEX,"$datfile");
                @index = <INDEX>;
                close(INDEX);
                foreach (@index)       {
                            $dzeil =$_;
                      chomp($dzeil);

    ($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
         print "Ihr Name                 = $name\n";
         print "Ihre Mitteilung          = $mitteilung\n";
         print "Ihr Passwort             = $passwort\n";
         print "Ihre Passwortbestätigung = $passwort2\n";
         exit;
         }
         }

    Diesmal bekomme ich einen Internal Server error.
    Es wäre nett wenn mir jemand gleich das funktionsfähige script hineinschreibt. Danke

    1. Halihallo

      Diesmal bekomme ich einen Internal Server error.
      Es wäre nett wenn mir jemand gleich das funktionsfähige script hineinschreibt. Danke

      He, he, nun mal langsam! - Ein Fehler wird nicht immer durch das Programm verursacht! - Bist du sicher, dass du die Rechte auf 755 gesetzt hast? - Ein 500 - Internal Server Error hat viele Ursachen.

      z. B.

      - Rechte falsch gesetzt (nicht auf 755)
       - kein Content-Type angegeben
           sollte übrigens print "Content-Type: text/html\015\012\015\012";
           heissen. Die RFC zu HTTP schreibt das so vor, auch wenn \n\n meistens auch funktioniert. Aber sicher ist sicher.

      Viele Grüsse

      Philipp

      1. Halihallo nochmals

        Zudem:
        Du hast irgendwo if ($action eq 'start'). $action ist auch undefiniert! - Das hätte dir "use strict" gesagt.
        Leider zeigt der Browser die Fehlermeldungen nicht an.

        Also, ich hab mal folgendes gebastelt und bei mir funktionierts:
        das use strict habe ich wieder rausgenommen, da dann zuviele Fehler kommen (bei use strict; müssen eben alle variablen mit my zuerst deklariert werden, dadurch gabs natürlich einige Hinweise).

        #!/usr/bin/perl
        $datfile="mitteilung.txt";

        my $action = 'start';  # das müsste schon sein, nicht?

        print "Content-type: text/html\n\n";
        ####### Formulardaten einlesen ###################
        my $cgi = new CGI;   # OOP!!!
        use CGI;
        my $name = $cgi->param("vuname");
        my $mitteilung = $cgi->param("mitteilung");
        my $passwort = $cgi->param("pw");
        my $passwort2 = $cgi->param("pwst");
        my $email = $cgi->param("email");

        if ($pw != $pwst) {
        print "<html><head><title>FEHLER</title></head>\n";
        print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
        print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
        print "<br><br>\n";
        print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
        print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
        };

        print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
        print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
        print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
        print "<br><br>\n";
             print "Ihr Name                 = $name <br>\n";
             print "Ihre Mitteilung          = $mitteilung <br>\n";
             print "Ihr Passwort             = $passwort <br>\n";
             print "Ihre E-Mail adresse      = $email <br>\n";
        print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";

        if ($action eq "start") {&start;}

        open(DATA,">>$datfile");
              print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
              close(DATA);

        sub start {
           open(INDEX,"$datfile");
                    @index = <INDEX>;
                    close(INDEX);
                    foreach (@index)       {
                                $dzeil =$_;
                          chomp($dzeil);

        ($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
             print "Ihr Name                 = $name\n";
             print "Ihre Mitteilung          = $mitteilung\n";
             print "Ihr Passwort             = $passwort\n";
             print "Ihre Passwortbestätigung = $passwort2\n";
             exit;
             }
             }

        Viele Grüsse

        Philipp

        1. Vielen Dank das script funktioniert jetzt.
          Allerdings sind wieder die ganzen Eingaben in einer einzigen Variable.

          so sieht die bestätigung bei mir aus:
          Vielen Dank für ihre Eingaben

          Ihr Name = Mein Name vhost=Das ist meine Mitteilung pw=das Passwort pwst=das Passwort
          Ihre Mitteilung =
          Ihr Passwort =
          Ihre E-Mail adresse =

          Zurück Ihr Name = test Ihre Mitteilung = Ihr Passwort = Ihre Passwortbestätigung =

          ist doch irgendwie schrecklich (finde ich)

          1. Ich habe noch ein zusätzliches Problem erkannt.
            Es ist überhaupt nur eine eintragung möglich. Das script schreibt nicht die vielen Einträge in eine datei ;(

            1. Ich habe noch ein zusätzliches Problem erkannt.
              Es ist überhaupt nur eine eintragung möglich. Das script schreibt nicht die vielen Einträge in eine datei ;(

              Also in die Datei schreiben tut es schon jeden Eintrag!
              Du hast ja ein

              open(DATA, ">>blabla");

              dann sollten schon alle Einträge aneinandergehängt werden. Vorsichtig wäre ich nur, wenn du ein <textarea> zur Eingabe des Textes verwendest. Da können deine User eben auch einige \n hinterlassen (damit verträgt sich dann dein Programm nicht!)

              Hast du schon mal in der Datei nachgesehen, was da drin geschrieben steht???

              Viele Grüsse

              philipp

          2. Halihallo

            Vielen Dank das script funktioniert jetzt.

            gut ;-)

            Allerdings sind wieder die ganzen Eingaben in einer einzigen Variable.

            ??? - Was?

            Ihr Name = Mein Name vhost=Das ist meine Mitteilung pw=das Passwort pwst=das Passwort

            Also das ist nicht möglich! - Irgendwo hast du bestimmt im Programm noch einige print-Anweisungen, die nicht dorthin müssen, o. ä.
            Ich finde auf jeden Fall keinen logischen Fehler.

            Vielleicht solltest du nochmals den aktuellen Code posten.

            Viele Grüsse

            Philipp

      2. Ich habe mein Apache auf Windows laufen, da brauche ich keine rechte zu setzen (denke ich), habe activePerl runtergeladen, das funktioniert auch. Andere scripts, die ich runtergeladen habe wie z.B. IkonBoard (falls du es kennst) funktioniert bei mir einwandfrei, blos dass ich die sendmail funktion nicht benutzen kann.

        1. Halihallo

          Ich habe mein Apache auf Windows laufen, da brauche ich keine rechte zu setzen (denke ich)

          Stimmt. Windows geht erkennt ein perl-Programm an der Dateiextension bzw. Apache liest es aus der conf - Datei.

          habe activePerl runtergeladen, das funktioniert auch. Andere scripts, die ich runtergeladen habe wie z.B. IkonBoard (falls du es kennst) funktioniert bei mir einwandfrei, blos dass ich die sendmail funktion nicht benutzen kann.

          NET::SMTP o. ä. Module funktionieren auch unter Windows.

          Viele Grüsse

          Philipp