kurti: Skrip laeuft net

Guten ABend liebe Vorumsteilnehmer!

Seit geraumer Zeit nun versuche ich das angehaengte Skript zum laufen zu bekommen.

Hochgeladen habe ich es im ascii mode, und attribut 755 auf skript und Verzeichnis(se) gegeben.

Laut syntax-check ist das skript i.O. dennoch bekomme ich immerwieder nen Internal server error.

Weiss jemand Rat?  Waere super!

Vielen Dank im Voraus und viele Gruesse,

Kurti

#!/usr/local/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use HTML::Parser;

Daten vom Formular bekommen

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

print "Content-type: text/html\n\n";

Daten auswerten

@Formularfelder = split(/&/, $Daten);
 $daten =~ s/[\n]/<br>/gi;
 $original = $daten;
 foreach $Feld (@Formularfelder)
 {
  ($name, $value) = split(/=/, $Feld);
  $value =~ s/%0D/<br>/gi;
  $value =~ s/[\n]/<br>/gi;
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;
  $Formular{$name} = $value;
 }

$datum                          = $Formular{'datum'};
$titel                          = $Formular{'titel'};
$betreuer                       = $Formular{'betreuer'};
$mitgliedskarten                = $Formular{'mitgliedskarten'};
$zuzahlung                      = $Formular{'zuzahlung'};
$ermaessigtekarten              = $Formular{'ermaessigtekarten'};
$ermaessigtekartenwert          = $Formular{'ermaessigtekartenwert'};
$schuelerkarten                 = $Formular{'schuelerkarten'};
$schuelerkartenwert             = $Formular{'schuelerkartenwert'};
$normalkarte                    = $Formular{'normalkarte'};
$normalkartenpreis              = $Formular{'normalkartenpreis'};
$rabattmarken                   = $Formular{'rabattmarken'};
$vorstand                       = $Formular{'vorstand'};
$presse                         = $Formular{'presse'};
$gaeste                         = $Formular{'gaeste'};
$besuchergesamt                 = $Formular{'besuchergesamt'};
$spenden                        = $Formular{'spenden'};
$einnahmengesamt                = $Formular{'einnahmengesamt'};
$ausgaben                       = $Formular{'ausgaben'};
$honorar                        = $Formular{'honorar'};
$einzuzahlendeeinnahmen         = $Formular{'einzuzahlendeeinnahmen'};
$kinstiut                       = $Formular{'kinstitut'};
$bemerkung                      = $Formular{'bemerkung'};

if ($datum eq '')
{
&error
};

if ($titel eq '')
{
&error
};

if ($mitgliedskarten eq '')
{
&error
};

if ($normalkarte eq '')
{
&error
};

if ($besuchergesamt eq '')
{
&error
};

if ($einnahmengesamt eq '')
{
&error
};

$anzbesucher = $mitgliedskarten + $ermaessigtekarten + $schuelerkarten + $normalkarte + $vorstand + $presse + $gaeste;
$anzzahlendebesucher = $mitgliedskarten + $ermaessigtekarten + $schuelerkarten + $normalkarte;
$einnahmen = ($mitgliedskarten * $zuzahlung) + ($ermaessigtekarten * $ermaessigtekartenwert) + ($schuelerkarten * $schuelerkartenwert) + ($normalkarte * $normalkartenpreis) - ($rabattmarken * 3);
$erreinzuzahlendeeinnahmen = $einnahmen - $ausgeben;
$finanzergebnis = $einnahmengesamt + ($mitgliedskarten *12) + ($mitgliedskarten * $zuzahlung) - $ausgaben - $honorar;

$zuzmgl = $mitgliedskarten * $zuzahlung;
$wertmglk = $mitgliedskarten * 12;
$wertermk = $ermaessigtekarten * $ermaessigtekartenwert;
$wertschuelerk = $schuelerkarten * $schuelerkartenwert;
$wertnormk = $normalkarte * $normalkartenpreis;

Nummer für Eintrag holen...

open (DATA, "</usr/www/users/danfun/kr/docs/count.dat") or die "kann counterfile nicht lesen! : $!";
@Zahl = <DATA>;
   # $MyZahl = @Zahl[0];
$Myzahl = join("",@Zahl);
close(DATA);
$Orizahl = $Myzahl;
$Myzahl++;

Deutsches Datum machen

$Jetztwert = time();
$Jetztzeit = localtime($Jetztwert);
&Deutschnamen;
@Zeit = split(/ +/,$Jetztzeit);
@Uhrzeit = split(/:/,$Zeit[3]);

&post;

#================================================================

sub Deutschnamen
{
 $Jetztzeit =~ s/Mon/Montag/;
 $Jetztzeit =~ s/Tue/Dienstag/;
 $Jetztzeit =~ s/Wed/Mittwoch/;
 $Jetztzeit =~ s/Thu/Donnerstag/;
 $Jetztzeit =~ s/Fri/Freitag/;
 $Jetztzeit =~ s/Sat/Samstag/;
 $Jetztzeit =~ s/Sun/Sonntag/;
 $Jetztzeit =~ s/Jan/Januar/;
 $Jetztzeit =~ s/Feb/Februar/;
 $Jetztzeit =~ s/Mar/Maerz/;
 $Jetztzeit =~ s/Apr/April/;
 $Jetztzeit =~ s/May/Mai/;
 $Jetztzeit =~ s/Jun/Juni/;
 $Jetztzeit =~ s/Jul/Juli/;
 $Jetztzeit =~ s/Aug/August/;
 $Jetztzeit =~ s/Sep/September/;
 $Jetztzeit =~ s/Oct/Oktober/;
 $Jetztzeit =~ s/Nov/November/;
 $Jetztzeit =~ s/Dec/Dezember/;
}

Ergebnisse zeigen...

sub post
{

print << "[END]";

<html>
[viel html geloescht]
</html>

[END]
}

EOP

Fehler

sub error
{
print << "[END]";
<html>

<head>
<title>Fehler!</title>
</head>

<body>

<h1>Achtung!</h1>
<p>&nbsp;</p>
<p>Leider ist bei der Eingabe der Daten ein Fehler aufgetreten.</p>
<p>Bitte versuchen Sie es erneut oder kontaktieren Sie Kurt Behning unter
05861-986220 oder per <a href="mailto:kurti(at)behning.de">E-Mail</a></p>

</body>

</html>
[END]

EOP

die;
}

  1. Hallo,

    Laut syntax-check ist das skript i.O. dennoch bekomme ich immerwieder nen Internal server error.

    Weiss jemand Rat?  Waere super!

    Hast du schonmal ueberprueft ob der Perl-Pfad in der ersten Zeile der richtige ist?

    gegebenenfalls diese Zeile korrigieren:
    #!/usr/local/bin/perl

    Ausserdem solltest du dir angewoehnen "use strict;" zu verwenden, was dir zwar in diesem Fall nicht weiterhelfen wird, aber dir oft hilft, Fehler zu vermeiden.

    mfG,
    steckl

    1. Moin!

      Hast du schonmal ueberprueft ob der Perl-Pfad in der ersten Zeile der richtige ist?

      Und ob das Script ausführbar für den Serveruser ist (chmod 755 im Zweifel).

      Ausserdem solltest du dir angewoehnen "use strict;" zu verwenden, was dir zwar in diesem Fall nicht weiterhelfen wird, aber dir oft hilft, Fehler zu vermeiden.

      Und zusätzlich sollte er sich use warnings; angewöhnen, was auch sehr gut gegen Fehler durch uninitialisiert Variablen z.B. hilft.

      -- Skeeve

      1. Hell-O!

        Ausserdem solltest du dir angewoehnen "use strict;" zu verwenden, was dir zwar in diesem Fall nicht weiterhelfen wird, aber dir oft hilft, Fehler zu vermeiden.
        Und zusätzlich sollte er sich use warnings; angewöhnen, was auch sehr gut gegen Fehler durch uninitialisiert Variablen z.B. hilft.

        Da kann ich noch einen draufsetzen: use diagnostics erspart oftmals das aufwändige Suchen a la "Was will mir diese Warnung sagen?"

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        Siechfreds Tagebuch || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
  2. Laut syntax-check ist das skript i.O. dennoch bekomme ich immerwieder nen Internal server error.

    was ist eine Syntaxcheck bei dir?
    Du hast das Skript in der Konsole aufgerufen und alles war i.O.?

    Weiss jemand Rat?  Waere super!

    Zu dem Skript fällt mir viel ein.

    #!/usr/local/bin/perl

    Der Pfad sieht verdächtig aus, kann aber stimmen.
    Du solltest dir die Warnungen (zumidnest in der Testphase) ausgeben lassen.

    #!/usr/local/bin/perl -w

    ebenso, wie schon erwähnt use strict verwenden, damit kannst du dir viele Stunden Fehlersuche ersparen.

    use CGI::Carp qw(fatalsToBrowser);
    use HTML::Parser;

    Es ist zwar nicht erkennbar wofür du dieses Modul nutzt, aber du scheinst Module zu kennen, daher wäre dir noch CGI.pm an's Herz gelegt. ein Modul das überall zu Verfügung stehen sollte und dir viele Dinge rund um CGI Skripte abnimmt.

    Daten vom Formular bekommen

    ...

    Das zum Beispiel könntest du alles komplett sparen.

    $datum                          = $Formular{'datum'};
    $titel                          = $Formular{'titel'};
    $betreuer                       = $Formular{'betreuer'};
    $mitgliedskarten                = $Formular{'mitgliedskarten'};
    $zuzahlung                      = $Formular{'zuzahlung'};
    $ermaessigtekarten              = $Formular{'ermaessigtekarten'};
    $ermaessigtekartenwert          = $Formular{'ermaessigtekartenwert'};
    $schuelerkarten                 = $Formular{'schuelerkarten'};
    $schuelerkartenwert             = $Formular{'schuelerkartenwert'};
    $normalkarte                    = $Formular{'normalkarte'};
    $normalkartenpreis              = $Formular{'normalkartenpreis'};
    $rabattmarken                   = $Formular{'rabattmarken'};
    $vorstand                       = $Formular{'vorstand'};
    $presse                         = $Formular{'presse'};
    $gaeste                         = $Formular{'gaeste'};
    $besuchergesamt                 = $Formular{'besuchergesamt'};
    $spenden                        = $Formular{'spenden'};
    $einnahmengesamt                = $Formular{'einnahmengesamt'};
    $ausgaben                       = $Formular{'ausgaben'};
    $honorar                        = $Formular{'honorar'};
    $einzuzahlendeeinnahmen         = $Formular{'einzuzahlendeeinnahmen'};
    $kinstiut                       = $Formular{'kinstitut'};
    $bemerkung                      = $Formular{'bemerkung'};

    dir ist klar das du jetzt die CGI Parameter in drei verschiedenen Variabeln global kopiert hast?
    Da sehe ich eine gewisse Redundanz

    if ($datum eq '')
    {
    &error
    };

    ...

    Das ist auch nicht wirklich schön.
    Perl bietet solche Konstrukte dafür an:

    error() unless $datum;

    Allerdings würde ich sowas in eine Funktion validierung() o.ä. auslagern, du produzierst so unleserlichen Spaghetticode.

    $anzbesucher = $mitgliedskarten + $ermaessigtekarten + $schuelerkarten + $normalkarte + $vorstand + $presse + $gaeste;
    $anzzahlendebesucher = $mitgliedskarten + $ermaessigtekarten + $schuelerkarten + $normalkarte;
    $einnahmen = ($mitgliedskarten * $zuzahlung) + ($ermaessigtekarten * $ermaessigtekartenwert) + ($schuelerkarten * $schuelerkartenwert) + ($normalkarte * $normalkartenpreis) - ($rabattmarken * 3);
    $erreinzuzahlendeeinnahmen = $einnahmen - $ausgeben;
    $finanzergebnis = $einnahmengesamt + ($mitgliedskarten *12) + ($mitgliedskarten * $zuzahlung) - $ausgaben - $honorar;

    $zuzmgl = $mitgliedskarten * $zuzahlung;
    $wertmglk = $mitgliedskarten * 12;
    $wertermk = $ermaessigtekarten * $ermaessigtekartenwert;
    $wertschuelerk = $schuelerkarten * $schuelerkartenwert;
    $wertnormk = $normalkarte * $normalkartenpreis;

    Das ist auch Spaghetticode.

    Nummer für Eintrag holen...

    open (DATA, "</usr/www/users/danfun/kr/docs/count.dat") or die "kann counterfile nicht lesen! : $!";
    @Zahl = <DATA>;
       # $MyZahl = @Zahl[0];
    $Myzahl = join("",@Zahl);
    close(DATA);
    $Orizahl = $Myzahl;
    $Myzahl++;

    Falls du $Myzahl später wieder in den Counter schreiben willst, ist dieser Ansatz unbrauchbar. du solltest mal einen Blick in deine Perl Doku (einer wird nicht genügen, diese ist sehr umfangreich) werfen, speziell in die FAQ5

    Deutsches Datum machen

    $Jetztwert = time();
    $Jetztzeit = localtime($Jetztwert);
    &Deutschnamen;
    @Zeit = split(/ +/,$Jetztzeit);
    @Uhrzeit = split(/:/,$Zeit[3]);

    Das geht ebenfalls einfacher mit Modulen:

    use POSIX qw(strftime);
    my $Jetztzeit = strftime "%D.%B.%Y", localtime( time() - 10000000 );
    (oder welche Formatierung du wünscht)

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hallo,

      use CGI::Carp qw(fatalsToBrowser);
      use HTML::Parser;

      Es ist zwar nicht erkennbar wofür du dieses Modul nutzt, aber du scheinst Module zu kennen, daher wäre dir noch CGI.pm an's Herz gelegt. ein Modul das überall zu Verfügung stehen sollte und dir viele Dinge rund um CGI Skripte abnimmt.

      Noch dazu, weil 'use CGI::Carp' eh schon darauf hinweist, dass es das CGI-Modul gibt.

      Was mir allerdings in deiner recht ausführlichen Analyse abgeht ist der Hinweis, dass eine weitere Fehlersuche ohne genauem Studium des Error-Logs vom Webservers so ziemlich eine Herumraterei ist;-)

      Grüße
        Klaus

      1. Was mir allerdings in deiner recht ausführlichen Analyse abgeht ist der Hinweis, dass eine weitere Fehlersuche ohne genauem Studium des Error-Logs vom Webservers so ziemlich eine Herumraterei ist;-)

        Stimmt, das war's.
        Mir fiel nichts als Resumee ein, ich hatte mich schon völlig verausgabt ;-)

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo Struppi!

          Mir fiel nichts als Resumee ein, ich hatte mich schon völlig verausgabt ;-)

          Hat sich aber gelohnt! Guter Beitrag!

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>