Skrip laeuft net
kurti
- perl
0 steckl2 Struppi
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;
if($ENV{'REQUEST_METHOD'} eq 'GET')
{
$Daten = $ENV{'QUERY_STRING'};
}
else
{
read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
}
print "Content-type: text/html\n\n";
@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;
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++;
$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/;
}
sub post
{
print << "[END]";
<html>
[viel html geloescht]
</html>
[END]
}
sub error
{
print << "[END]";
<html>
<head>
<title>Fehler!</title>
</head>
<body>
<h1>Achtung!</h1>
<p> </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]
die;
}
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
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
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
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.
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
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.
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