Ralf d.: Probleme mit $ENV{SCRIPT_NAME}

Hallo zusammen!

Ich arbeite mich gerade ein im CGI/DBI und habe aus einem Buch ein Perl Script abgetippt das leider nicht funktioniert.
Das Script soll mit Templates arbeiten und weisst einer Variable den Wert von $ENV{"SCRIPT_FILE_NAME"} zu.
Leider bleibt diese Variable leer......
Wenn ich den Wert der eigentlich drin stehen soll eintrage ($action = "/cgi-bin/reg.pl";)
erhalte ich folgenden Server Fehler:
malformed header from script. Bad header=/cgi-bin/reg.pl: reg.pl

woran kann das liegen?
Wenn ich mit einem Beispiel-Code aus dem Selfhtml die Servervariablen ausgeben lasse dann wird der richtige wert angezeigt.

Bin um jeden Ratschlag dankbar.

  1. Hi,

    Leider bleibt diese Variable leer......

    dazu wäre wohl etwas Beispielcode notwendig.

    Wenn ich den Wert der eigentlich drin stehen soll eintrage ($action = "/cgi-bin/reg.pl";)
    erhalte ich folgenden Server Fehler:
    malformed header from script. Bad header=/cgi-bin/reg.pl: reg.pl

    Steht im Skript print "Content-type: text/html\n\n"; ?

    Stefan

    1. Ok, Hier jetzt ein bisschen was aus dem COde:

      use strict;
      use CGI qw( :cgi );
      use Template ();

      our $templDir= "C:/templates";
      our $action = $ENV{"SCRIPT_FILE_NAME"};
      #our $action = "/cgi-bin/reg.pl";
      our $q=new CGI();

      --> wenn ich jetzt hier die $action ausgeben lasse steht nix drin
      --> wenn ich die auskommentierte Zeile verwende steht zwar was drin aber ich kriege den ServerFehler wie im ersten Post beschrieben.

      So gehts weiter:
      our @headers=("Content-Type: text/html" );
      our $headersSent=0;
      printHeaders();
      printLoginForm();
      .
      .
      .
      und hier die Subroutinen die aufgerufen wird:
      sub printHeaders
      {
              if( $headersSent)
              {
                      return;
              }

      foreach my $header (@headers)
              {
                      print ("$header\n");
              }
              print ("\n");
              $headersSent=1;
      }

      sub printLoginForm
      {
              my $fname="wfLoginForm.html";
              my $path="$templDir/$fname";
              my $templ = new Template( $path, "r" );

      unless( $templ )
              {
                      return undef;
              }

      my %subs =();                 #Hash deklarieren

      # $action wird im Hauptprogramm gesetzt
              #Hash mit keys und werten setzen
              $subs{"action"} = $action;
              $subs{"login"} = $q->param( "login" ) || "";
              $subs{"pwd"} = $q->param( "pwd" ) || "";
              $subs{"pwdRepeat"} = $q->param( "pwdRepeat" ) || "";
              $subs{"email"} = $q->param( "email" ) || "";

      print( $templ->substitute( %subs ));         #referenz auf das subs-hash
      }

      Hoffe das nützt was.
      Ich hab jetzt mal nur Austüge aus dem Code gepostet, ich kann auch den gesamten posten, is halt bisser lang, und ich denke wenn ichs hinkriege das ein Template aufgerufen wird dann ists mit den anderen auch kein problem.

      gruss

      ralf

      1. Hi,

        $subs{"action"} = $action;

        das funktioniert nicht, ich überlege gerade warum. So sollte es klappen:
        $subs{"action"} = "$action";
        Wenn $ENV{"SCRIPT_FILE_NAME"} leer bleibt, kannst du auch CPAN: File::Find verwenden, um den Pfad auszulesen.

        Stefan

        1. Also die Variable müsste gesetzt sein.
          Ich bin langsam am verzweifeln.
          Ich poste hier mal unverschämt den ganzen code, vielleicht kann mal jemand ausprobieren ob das bei ihm läuft.

          #!c:\apachefriends\xampp\xampp\perl\bin\perl.exe

          use strict;
          use CGI qw( :cgi );
          use Template ();

          #_______________________________________________________
          #________START HAUPTPROGRAMM_____________________________
          #variablen für das Template verzeichnis und unsere eigene URI unter dem wir vom client aufgerufen werden
          our $templDir= "C:/templates";
          our $action = $ENV{"SCRIPT_NAME"};

          our $q=new CGI();

          #--->VARIABLEN
          our $login="";
          our $pwd="";
          our $pwdRepeat="";
          our $email="";
          our $firstname="";
          our $lastname="";
          our $gender="";
          our $street="";
          our $zip="";
          our $city="";
          our $bankName="";
          our $bankCode="";
          our $accountNum="";
          #<---

          #http header senden
          our @headers=("Content-Type: text/html" );
          our $headersSent=0;

          printHeaders();

          my $formName = $q->param( "formName" );
          unless ($formName)
          {
                  printLoginForm();
                  exit (0);
          }

          if ($formName eq "loginForm")
          {
                  unless (checkLoginForm())
                  {
                          printLoginForm();
                          exit (0);
                  }
                  printPersForm();
                  exit(0);
          }
          elsif ($formName eq "persForm")
          {
                  unless (checkPersForm())
                  {
                          printPersForm();
                          exit(0);
                  }
                  printPmtForm();
                  exit(0);
          }
          elsif ($formName eq "pmtForm")
          {
                  unless (checkPmtForm())
                  {
                          printPmtForm();
                          exit(0);
                  }
                  printReviewForm();
                  exit(0);
          }
          elsif ($formName eq "ReviewForm")                                                #Speicherung der Daten und Ausgabe
          {
                  printAnswer();
                  exit(0);
          }
          else
          {
                  print("$formName ist ein falsches Formular");
                  exit(1);
          }
          exit(0);

          #_______________________________________________________
          #________ENDE HAUPTPROGRAMM_____________________________
          #_______________________________________________________

          #SUBFUNKTIONEN:
          #*******************************************************
          sub checkLoginForm
          {
                  #alle Formulardaten einlesen
                  #um undef werte auszuschliessen werden sie mit einen leeren string belegt wenn sie einen false wert besitzen
                  $login = $q->param( "login" ) || "";
                  $pwd = $q->param( "pwd" ) || "";
                  $pwdRepeat = $q->param( "pwdRepeat" ) || "";
                  $email = $q->param( "email" ) || "";

          #Keines der Felder darf leer sein
                  unless ($login and $pwd and $pwdRepeat and $email)
                  {
                          return undef;
                  }

          #Kennwort wiederholung überprüfen:
                  if($pwdRepeat ne $pwd)
                  {
                          return undef;
                  }

          return 1;
          }

          #*******************************************************
          sub checkPersForm
          {
                  $firstname = $q->param( "firstname" ) || "";
                  $lastname = $q->param( "lastname" ) || "";
                  $gender = $q->param( "gender" ) || "";
                  $street = $q->param( "street" ) || "";
                  $zip = $q->param( "zip" ) || "";
                  $city = $q->param( "city" ) || "";

          unless($firstname and $lastname and $gender and $street and $zip and $city)
                  {
                          return undef;
                  }

          return 1;
          }

          #*******************************************************
          sub checkPmtForm
          {
                  $bankName = $q->param( "bankName" ) || "";
                  $bankCode = $q->param( "bankCode" ) || "";
                  $accountNum = $q->param( "accountNum" ) || "";

          unless($bankName and $bankCode and $accountNum)
                  {
                          return undef;
                  }
          }

          #*******************************************************
          sub addHeader
          {
                  #Funktion mit welcher ein oder mehrere http Header in die zu sendenden Liste aufgenommen werden
                  #die Liste der Header steht in der globalen Variable @headers

          #keine leeren header aufnehmen
                  unless (@_) {return;}
                  push( @headers,@_);         #push: fügt ein oder mehrere Elemente an ein array an
          }

          #*******************************************************
          sub printHeaders
          {
                  #Funktion die alle http header an den Client schickt; muss vor der ausgabe von daten aufgerufen werden
                  #mit der Variablen $headersSent wird verhindert das die header mehrfach gesendet werden

          if( $headersSent)
                  {
                          return;
                  }

          foreach my $header (@headers)
                  {
                          print ("$header\n");
                  }
                  print ("\n");
                  $headersSent=1;
          }

          #*******************************************************
          sub printLoginForm
          {
                  #Funktion für das Formular der Logindaten
                  my $fname="wfLoginForm.html";
                  my $path="$templDir/$fname";
                  my $templ = new Template( $path, "r" );

          unless( $templ )
                  {
                          return undef;
                  }

          my %subs =();                 #Hash deklarieren

          # $action wird im Hauptprogramm gesetzt
                  #Hash mit keys und werten setzen
                  $subs{"action"} = $action;
                  $subs{"login"} = $q->param( "login" ) || "";
                  $subs{"pwd"} = $q->param( "pwd" ) || "";
                  $subs{"pwdRepeat"} = $q->param( "pwdRepeat" ) || "";
                  $subs{"email"} = $q->param( "email" ) || "";

          print( $templ->substitute( %subs ));         #referenz auf das subs-hash
          }

          #*******************************************************
          sub printPersForm
          {
                  #Funktion für die Ausgabe der pers. Daten
                  my $fname="wfPersForm.html";
                  my $path="$templDir/$fname";
                  my $templ=new Template($path,"r");

          unless ($templ)
                  {
                          return undef;
                  }

          my %subs=();                #hash deklarieren

          $subs{"action"}=$action;
                  $subs{"firstname"}=$q->param("firstname")||"";
                  $subs{"lastname"}=$q->param("lastname")||"";
                  $subs{"gender"}=$q->param("gender")||"";
                  $subs{"femaleChecked"}="checked";
                  if($gender eq "m")
                  {
                          $subs{"maleChar"}="r";
                          $subs{"maleChecked"}="checked";
                          $subs{"femaleChecked"}="";
                          $subs{"title"}="Herr";
                  }

          $subs{"street"}=$q->param("street")||"";
                  $subs{"zip"}=$q->param("zip")||"";
                  $subs{"city"}=$q->param("city")||"";

          print($templ->substitute(%subs));
          }

          #*******************************************************
          #Funtkion für die Ausgabe des Formulars der Zahlungsmethode
          sub printPmtForm
          {
                  my $fname="wfPmtForm.html";
                  my $path="$templDir/$fname";
                  my $templ=new Template($path,"r");

          unless ($templ)
                  {
                          return undef;
                  }

          my %subs=();                #hash deklarieren

          $subs{"action"}=$action;
                  $subs{"bankName"}=$q->param("bankName")||"";
                  $subs{"bankCode"}=$q->param("bankCode")||"";
                  $subs{"accountNum"}=$q->param("accountNum")||"";

          print($templ->substitute(%subs));
          }

          #*******************************************************
          #Funtkion für den Review Step:
          sub printReviewForm
          {
                  my $fname="wfReview.html";
                  my $path="$templDir/$fname";
                  my $templ=new Template($path,"r");

          unless ($templ)
                  {
                          return undef;
                  }

          my %subs=();                #hash deklarieren

          $subs{"action"}=$action;
                  $subs{"login"}=$q->param("login")||"";
                  $subs{"pwd"}=$q->param("pwd")||"";
                  $subs{"pwdRepeat"}=$q->param("pwdRepeat")||"";
                  $subs{"email"}=$q->param("email")||"";
                  $subs{"firstname"}=$q->param("firstname")||"";
                  $subs{"lastname"}=$q->param("lastname")||"";
                  $subs{"gender"}=$q->param("gender")||"";
                  $subs{"street"}=$q->param("street")||"";
                  $subs{"zip"}=$q->param("zip")||"";
                  $subs{"city"}=$q->param("city")||"";
                  $subs{"accountNum"}=$q->param("accountNum")||"";

          print($templ->substitute(%subs));
          }

          #*******************************************************
          #Funtkion für die Ausgabe der Antwort nach dem Commit step:
          sub printAnswer
          {
                  my $fname="wfCommit.html";
                  my $path="$templDir/$fname";
                  my $templ=new Template($path,"r");

          unless ($templ)
                  {
                          return undef;
                  }

          my %subs=();                #hash deklarieren

          my $gender=$q->param("gender");
                  $subs{"maleChar"}=($gender eq "m")?"r":"";
                  $subs{"title"}=($gender eq "m")?"Herr":"Frau";
                  $subs{"lastname"}=$q->param("lastname")||"";
                  $subs{"login"}=$q->param("login")||"";

          print($templ->substitute(%subs));
          }

          Bin für jeden Ratschlag dankbar.
          Langsam glaube ich nimmer das es an der $ENV{SCRIPT_NAME} liegt.

      2. Hallo Ralf d.

        Ok, Hier jetzt ein bisschen was aus dem COde:

        use strict;
        use CGI qw( :cgi );
        use Template ();

        our $templDir= "C:/templates";
        our $action = $ENV{"SCRIPT_FILE_NAME"};
        #our $action = "/cgi-bin/reg.pl";
        our $q=new CGI();

        --> wenn ich jetzt hier die $action ausgeben lasse steht nix drin
        --> wenn ich die auskommentierte Zeile verwende steht zwar was drin aber ich kriege den ServerFehler wie im ersten Post beschrieben.

        Lass dir mal ausgeben, ob die Variabel auf deinem Server überhaupt gesetzt ist.

          
        use CGI qw/:standard/;  
        use Cwd ;  
        print header,  
          start_html,  
          h2("Environment:"),  
          (map { p("$_ => $ENV{$_}") } sort keys %ENV),  
          end_html;  
        
        

        Struppi.

  2. Wenn ich mit einem Beispiel-Code aus dem Selfhtml die Servervariablen ausgeben lasse dann wird der richtige wert angezeigt.

    Du meinst env.pl von http://de.selfhtml.org/servercgi/cgi/ ?
    Hmm, seltsam - normalerweise hätte ich gesagt dass es daran liegt, dass die Umgebungsvariablen ja leider nicht einheitlich von den Webservern genutzt werden. Aber daran kanns ja nicht liegen wenn bei env.pl die Variable angezeigt wird.
    Aber alternativ kannst du ja mal schauen, ob vielleicht die $ENV{'SCRIPT_NAME'} verfügbar ist. Dann könntest du daraus mittels regulären Ausdrücken die physische Adresse auf dem Server ermitteln.