Serverfehler Error 500 bei Scriptausführung
Sören
- perl
Hi,
ich habe folgenden Code:
#!"\xammp\perl\bin\perl.exe" -w
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(ceil floor);
$pics_nr = 105;
$pics_seiten = ceil($pics_nr/16);
$pics_count = 0;
$pics_name = 1;
$pics_break = 1;
$page_name = 1;
foreach ($pics_seiten) {
open($page_name,">$page_name.html") || die("FEHLER: Datei kann nicht geschrieben werden...");
print $page_name "Content-type: text/html\n\n";
print $page_name "<html><body>";
print $page_name "<center><table>";
print $page_name "<tr>";
while ($pics_count <= 16) {
if ($pics_breack == 1) {print $page_name "<tr>"}
$pics_count++;
print $page_name "<td><img src="img/$page_name.jpg" /></td>";
$pics_name++;
if ($pics_break == 4) {print $page_name "</tr><tr>"; pics_break = 1;};
$pics_brack++;
}
if ($pics_break != 4) {print $page_name "</tr>"; pics_break = 1;};
print $page_name "</table></center>";
print $page_name "</html></body>";
close($page_name);
$page_name++;
$page_count = 1;
}
in dem Skalar $pics_nr habe ich gespeichert wieviele Bilder im Ordner img sind (ich weiß, das es besser wäre, wenn ich den Ordner auslese, aber soweit bin ich leider noch nicht). In dem Skalar sage ich, wieviele Seiten erstelle werden sollen und wieviele Bilder eine Seite haben soll. Die restlichen Skalare sind zum Zählen da.
Der Code soll eine HTML-Setie erzeugen, die eine Zentrierte Tabelle enthält (bitte jetzt keine Diskussion darüber, das <div>-Tags eleganter wären). Jede Zeile dieser Tabelle soll 4 Zellen mit einem Bild enthalten.
Ich hoffe das Prinzip des Codes ist verständlich. Wenn nicht, einfach nachfragen ;)
Wenn ich diese Datei jetzt ausführe, dann wird mir folgende Fehlermeldung im Brwoser ausgegeben:
Serverfehler!
Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
couldn't create child process: 720003: pic.cgi
Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
127\.0.0.1
07/09/08 07:30:23
Apache/2.2.8 (Win32) DAV/2 mod_ssl/2.2.8 OpenSSL/0.9.8g mod_autoindex_color PHP/5.2.5
Das Perl Modul ist korrekt installiert und Funktioniert auch. Also daran kanns nicht liegen.
Vielen dank schonmal im Vorraus
Søren
Hallo Søren!
[code lang=perl]
#!"\xammp\perl\bin\perl.exe" -w
Die Pfadangabe scheint nicht komplett zu sein. Laufwerk?
Hm, bei mir heißt das Ding »xampp«, nur ein »m«, dafür zwei »p« - die nämlich stehen für _P_erl, _P_HP. Dafür kommt Perl in der Standardinstallation von Xampp ohne Module. Daher die erste Frage (und einzige vorerst): Hast Du das Addon mit den Modulen nachinstalliert?
ich weiß, das es besser wäre, wenn ich den Ordner auslese, aber soweit bin ich leider noch nicht
Du hattest aber vor wenigen Tagen bereits gefragt, aber nicht mehr nachgehakt. Warum nicht?
couldn't create child process: 720003: pic.cgi
Wie sieht die Apache-Konfiguration aus? »Funzen«(TM) andere Perl-Skripte? Oder hakt nur dieses? Der Perl-Prozess kann nicht generiert werden, wenn das ein reiner Code-Fehler wäre, würde »fatalsToBrowser« Dir die Meldung im Browser ausliefern.
Viele Grüße aus Frankfurt/Main,
Patrick
Hi,
die Pfadeingabe is so korrekt...so ist sie auch bei den Testdateien notiert. Das überhaupt nix gelaufen is, lag wirklich daran, das ich nen m statt nen p notiert hatte.
Wenn man das korrektiert, dann bekommt man die Fehlermeldung, das in der Zeile, wo die Zelle erstellt wird, nen Syntaxfehler vorliegt. Den habe ich korrektiert. Sie muss jetzt so aussehen: print $page_name '<td><img src="img/$page_name.jpg" /></td>';
Jetzt wird mir folgende Fehlermeldung angezeigt:
Software error:
Can't modify constant item in scalar assignment at C:/xampp/htdocs/cw/pic.cgi line 25, near "1;"
Unrecognized character \xF8 at C:/xampp/htdocs/cw/pic.cgi line 36.
Ich habe nicht mehr nachgehakt, weil ich das Erstellen, der Dateien als Basis meines Programms ansehe und Diesen Teil zuerst zum laufen bringen will. Um das Auslesen des Ordners kümmere ich mich anschließend.
Gruß
Sören
print $page_name '<td><img src="img/$page_name.jpg" /></td>';
Da fehlt ein Komma oder sowas. Außerdem möchtest du interpolieren, das geht bei single quotes in die Hose.
~JJ
print $page_name '<td><img src="img/$page_name.jpg" /></td>';
Da fehlt ein Komma oder sowas.
Nein, fehlt es nicht. Der OP will in ein Filehandle schreiben.
Außerdem möchtest du interpolieren, das geht bei single quotes in die Hose.
Grundsätzlich richtig, sollte aber im vorliegenden Fall nicht die Ursache der Fehlermeldung sein.
Siechfred
Hi,
print $page_name "Content-type: text/html\n\n";
Wenn Du das Script über die CGI-Schnittstelle des Webservers ausführen willst, muss der Content-type auf STDOUT gehen.
Starte das Script auf der Kommandozeile, use strict; und schaue ersteinmal da, ob es sauber läuft.
Hotte
ich habe folgenden Code:
Solch einen Code solltest du nicht öffentlich zeigen, er ist extrem unsauber und zudem kann er nicht funktionieren.
#!"\xammp\perl\bin\perl.exe" -w
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(ceil floor);
[code lang=perl][link:http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrict@title=use strict]
> $pics\_nr = 105;
> $pics\_seiten = ceil($pics\_nr/16);
> $pics\_count = 0;
> $pics\_name = 1;
> $pics\_break = 1;
> $page\_name = 1;
>
>
> foreach ($pics\_seiten) {
Perl Schleifen sind zwar flexibel, aber das ist keine. Diese Schleife wird nur einmal durchlaufen, war das so geplant?
> open($page\_name,">$page\_name.html") || die("FEHLER: Datei kann nicht geschrieben werden...");
Hier kannst du dir noch den Grund anzeigen lassen
`open($page_name,">$page_name.html") || die("FEHLER: Datei kann nicht geschrieben werden... weil: $!");`{:.language-perl}
> print $page\_name "Content-type: text/html\n\n";
Du gibst den header, den eigentlich der Browser sehen will in eine Datei aus.
> print $page\_name "<html><body>";
> print $page\_name "<center><table>";
> print $page\_name "<tr>";
Den header und HTML Code kann man eleganter mit dem [CGI Modul](http://de.selfhtml.org/perl/module/cgi.htm) ausgeben.
> in dem Skalar $pics\_nr habe ich gespeichert wieviele Bilder im Ordner img sind (ich weiß, das es besser wäre, wenn ich den Ordner auslese, aber soweit bin ich leider noch nicht). In dem Skalar sage ich, wieviele Seiten erstelle werden sollen und wieviele Bilder eine Seite haben soll.
Nur macht das der Code nicht, dann musste die Schleife so aussehen:
`for (1..$pics_seiten) {`{:.language-perl}
(Wenn du bei 1 anfängst zu zählen)
> Der Code soll eine HTML-Setie erzeugen, die eine Zentrierte Tabelle enthält (bitte jetzt keine Diskussion darüber, das <div>-Tags eleganter wären).
Nein, Div wären nicht eleganter um die Seite zu zentrieren, dafür brauchst du kein zusätzliches Element und Bilder nebeneinander anordnen kannst du mit float, dann passen soviele Bilder nebeneinander wie im Browserfenster Platz haben und du könntest die ganze Sache noch einfacher programmieren, aber das ist ein anderes Thema.
>
> Wenn ich diese Datei jetzt ausführe, dann wird mir folgende Fehlermeldung im Brwoser ausgegeben:
Im zweifelsfall ist es oft günstiger, das Skript in der Konsole bzw. im DOS Fenster auszuführen, dann sind die Fehlermeldungen auch klarer und du siehst was dein Skript ausgibt. Wobei in dem Fall erstmal der Pfad zu Perl stimmen sollte. Unter Windows ist es auch möglich, den Server so zu konfigurieren, dass du diese Zeile einbauen kannst, dass sie auch unter einem Linux funktioniert. Der Eintrag in der Apache Konfiguration lautet: ScriptInterpreterSource registry
Struppi.
Hi,
ich habe den Code jetzt zu folgendem geändert:
#!"\xampp\perl\bin\perl.exe" -w
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(ceil floor);
use strict;
my $pics_nr = 105;
my $pics_seiten = ceil($pics_nr/16);
my $pics_count = 0;
my $pics_name = 1;
my $pics_break = 1;
my $page_name = 1;
for (my $i = 1; $i <= $pics_seiten; $i++) {
open($page_name,">$page_name.html") || die("FEHLER: Datei kann nicht geschrieben werden...");
print $page_name "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
print $page_name "<html><body>";
print $page_name "<center><table>";
print $page_name "<tr>";
while ($pics_count <= 16) {
if ($pics_breack == 1) {print $page_name "<tr>"}
$pics_count++;
print $page_name "<td><img src=\"img/$page_name.jpg\" /></td>'";
$pics_name++;
if ($pics_break == 4) {print $page_name "</tr><tr>"; pics_break = 1;};
$pics_brack++;
}
if ($pics_break != 4) {print $page_name "</tr>"; pics_break = 1;};
print $page_name "</table></center>";
print $page_name "</html></body>";
close($page_name);
$page_name++;
$page_count = 1;
}
Jetzt wir mir noch folgende Fehlermeldung angezeigt:
Software error:
Global symbol "$pics_breack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 24.
Global symbol "$pics_brack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 29.
Global symbol "$page_count" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 37.
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 28.
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 31.
Execution of C:/xampp/htdocs/cw/pic.cgi aborted due to compilation errors.
Jetzt wir mir noch folgende Fehlermeldung angezeigt:
Software error:Global symbol "$pics_breack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 24.
Global symbol "$pics_brack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 29.
Global symbol "$page_count" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 37.
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 28.
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 31.
Execution of C:/xampp/htdocs/cw/pic.cgi aborted due to compilation errors.
Das ist eine durch use strict getriggerte Prüfung welche dich darauf aufmerksam machen sollte, dass
brack != break != breack
Achte auf deine Typos!
mfg Beat
Hi,
Achte auf deine Typos!
"Achte auf den Milchtopf!"
"Das habe ich. Er ist um genau 12:53 Uhr übergekocht."
Cheatah, SCNR
Global symbol "$pics_breack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 24.
Schreibfehler.
Global symbol "$pics_brack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 29.
Schreibfehler.
Global symbol "$page_count" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 37.
Nicht initialisierte lexikalische Variable.
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 28.
Sigil vergessen ($ vermutlich).
Bareword "pics_break" not allowed while "strict subs" in use at C:/xampp/htdocs/cw/pic.cgi line 31.
Sigil vergessen ($ vermutlich).
Execution of C:/xampp/htdocs/cw/pic.cgi aborted due to compilation errors.
Na, das will ich meinen ;)
Siechfred
Global symbol "$pics_breack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 24.
Wo wird pics_breack deklariert (my ...)?
Global symbol "$pics_brack" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 29.
Wo wird pics_brack deklariert (my ...)?
Global symbol "$page_count" requires explicit package name at C:/xampp/htdocs/cw/pic.cgi line 37.
Wo wird page count deklariert (my ...)?
Du solltest etwas mehr auf die Rechtschreibung achten :-)
Viele, vielen dank für die vielen Tips und Hilfestellungen. Hat mir echt extrem weitergeholfen.
Das Script is jetzt soweit fertig. Wenn ich die Datei aufrfe, wird mir zwar nen Server-Fehler angezeigt, die Dateien werden trotzdem ordnungsgemäß erstellt.
Jetzt habe ich ne frage zu CSS in dem zusammen hang. Die Bilder sind alle 1024x768 bzw 576x768. Diese Will ich verkleinert Dargestellt haben. Die Zellen sind 250x250 groß. Wenn ich im <img>-Tag nichts mache, dann werden mir die Bilder in voller Größe angezeigt. Wenn ich das Bild prozentual verkleiner, dann richtet sich die Verkleinerung an den Zellen aus.
Ach ja...der Code sieht jetzt wie folgt aus:
#!"\xampp\perl\bin\perl.exe" -w
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(ceil floor);
use strict;
#Zeile 6
my $pics_nr = 105;
my $pics_seiten = ceil($pics_nr/16);
my $pics_count = 0;
my $pics_name = "001";
my $pics_break = 1;
my $page_name = 1;
my $page_count = 1;
#Zeile 14
for (my $i = 1; $i <= $pics_seiten; $i++) {
open(dies,">$page_name.html") || die("FEHLER: Datei kann nicht geschrieben werden...");
print dies "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
print dies "<html>\n";
print dies "<head>\n <style type=\"text/css\">\n td {height:250px; width:250px;}\n }\n</style>\n</head>\n";
print dies "<body>\n";
print dies "<center>\n<table border=1>\n";
print ies "<tr>\n";
while ($pics_count < 9) {
#if ($pics_break == 1) {print dies "<tr>\n"}
$pics_count++;
print dies "<td align=\"center\"><img src=\"img/$pics_name.JPG\"/></td>\n";
$pics_name++;
if ($pics_break == 3) {print dies "</tr>\n<tr>\n"; $pics_break = 0;};
$pics_break++;
}
if ($pics_break != 3) {print dies "</tr>\n"; $pics_break = 1;};
print dies "</table></center>\n";
print dies"</html></body>\n";
close(dies);
$page_name++;
$page_count = 1;
}
So, ich hab nochmal den Code verändert...
#!"\xampp\perl\bin\perl.exe" -w
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(ceil floor);
use strict;
#Zeile 6
my $pics_nr = 105;
my $pics_pro = 9;
my $pics_seiten = ceil($pics_nr/$pics_pro);
my $pics_count = 0;
my $pics_name = "001";
my $pics_break = 1;
my $page_name = 1;
my $page_count = 1;
#Zeile 14
for (my $i = 1; $i <= $pics_seiten; $i++) {
open(dies,">$page_name.html") || die("FEHLER: Datei kann nicht geschrieben werden...");
print dies "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
print dies "<html>\n";
print dies "<head>\n <style type=\"text/css\">\n .pics {height:150px;}\n img {height: 150px;}\n</style>\n</head>\n";
print dies "<body>\n";
print dies "<center>\n<table border=0>\n";
print ies "<tr>\n";
while ($pics_count < 9) {
$pics_count++;
print dies "<td align=\"center\" class=\"pics\"><img src=\"img/$pics_name.JPG\"/></div></td>\n";
$pics_name++;
if ($pics_break == 3) {print dies "</tr>\n<tr>\n"; $pics_break = 0;}
$pics_break++;
}
if ($pics_break != 3) {print dies "</tr>\n"; $pics_break = 1;}
my $h = $i-1;
my $j = $i+1;
if( $i == 1) {print dies "<tr>\<td height=14px></td>\n<td>Seite $i</td>\n<td><a href=\"$j.html\">Weiter</a></td>"; last;}
if( $i < $pics_seiten) {print dies "<tr height=14px><td><a href=\"$h.html\">Zurück</a></td><td>Seite $i</td><td><a href=\"$j.html\">Weiter</a></td>"; last;}
else {print dies "<tr height=14px><td><a href=\"$h.html\">Zurück</a></td><td>Seite $i</td><td></td>"; last;}
print dies "</table></center>\n";
print dies"</html></body>\n";
close(dies);
$page_name++;
$page_count = 1;
$pics_count = 0;
$pics_break = 1;
}
Aus irgendwelchen Gründen steht nur auf der ersten Seite "border=0" auf allen anderen Seiten steht "border=1".
Und wenn ich in die While-Schleife die bedingte Anweisung: "if ($pics_nr < $pics_name) {last;}" einfüge, dann werden die Zahlen nciht mehr mit drei ziffern (also statt 1..001, usw.) ausgegeben, sondern die "Füll-Nullen" verschwinden. Woran liegt das?
gruß
Sören
Hallo Søren!
Nur mal kurz... Struppi hat Dir vorhin eine sehr gute Antwort geliefert, seine Ratschläge solltest Du befolgen (CGI-Modul benutzen, wenn es darum geht, HTML-Code zu erzeugen, $! bei die() benutzen).
Deine Filehandle-Bezeichnung »dies« ist denkbar schlecht. Generell werden (wohl per Konvention) Filehandles groß geschrieben, zweitens sollten die Bezeichnungen, genauso wie für Variablen, selbstsprechend sein. Hier würde ich einfach »FILE« oder »HTMLFILE« anstatt »dies« nehmen.
Und wenn ich in die While-Schleife die bedingte Anweisung: "if ($pics_nr < $pics_name) {last;}" einfüge, dann werden die Zahlen nciht mehr mit drei ziffern (also statt 1..001, usw.) ausgegeben, sondern die "Füll-Nullen" verschwinden. Woran liegt das?
Keine Programmiersprache kennt Zahlen, die mit Nullen anfangen (ich denke, Deine Bilder heißen 001.jpg o.Ä.). Eine derartige Prüfung musst Du einprogrammieren.
Denke auch dran, dass Perl und andere Programmiersprachen eine Zahl mit einer führenden Null als Oktalzahl erkennen.
Viele Grüße aus Frankfurt/Main,
Patrick
Okay. Das war mir gar nciht so bewusst...hab bis jetzt nur JavaScript "programmiert" und da is sowas nicht so sehr ins gewicht gefallen...ich glaub ich lass das mit den Nullen dann einfach Weg.
Keine Programmiersprache kennt Zahlen, die mit Nullen anfangen (ich denke, Deine Bilder heißen 001.jpg o.Ä.). Eine derartige Prüfung musst Du einprogrammieren.
Oh, da kennst du Perl schlecht, das Søren da macht funktioniert:
my $zahl = '001';
foreach(1..16) {
print $zahl++, "\n";
}
Schon erstaunlich und ich glaube es gibt wirklich kaum eine andere Programmiersprache die sowas macht.
Struppi.
Hallo Struppi!
my $zahl = '001';
foreach(1..16) {
print $zahl++, "\n";
}
> Schon erstaunlich und ich glaube es gibt wirklich kaum eine andere Programmiersprache die sowas macht.
Hm, ja... mag vielleicht in dem Beispiel funktionieren, und es stimmt wohl, dass Perl mächtiger ist, als andere, kopierte »Nachfolger« mit \_H\_ome\_P\_age im Namen ;)
Hm, wie kommst Du auf 16? Ich habe mehr Jahre auf Lager ;)
Viele Grüße aus Frankfurt/Main,
Patrick
--
![](http://www.atomic-eggs.com/fuernA.jpg)
\_ - jenseits vom delirium - \_
[[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]
Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)
Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?
All'alba vincerò!
Hm, wie kommst Du auf 16? Ich habe mehr Jahre auf Lager ;)
*g* keine Ahnung, das war von heute morgen noch da, wo ich testen wollte wie die Schleife für Søren richtig funktioniert.
Struppi.
Hallo Struppi!
Hm, wie kommst Du auf 16? Ich habe mehr Jahre auf Lager ;)
*g* keine Ahnung
Nun ja, ich wär's gern wieder und würde alles genauso falsch machen, wie als ich es wirklich war ;)
Ich bereue keine meiner Dummheiten!
Viele Grüße aus Frankfurt/Main,
Patrick
Das Script is jetzt soweit fertig. Wenn ich die Datei aufrfe, wird mir zwar nen Server-Fehler angezeigt, die Dateien werden trotzdem ordnungsgemäß erstellt.
Dei Skript gibt nichts zurück!
Ohne header kommt ein Fehler.
Das reicht in deinem Fall
use CGI;
print CGI::header(-status => 204);
Zum Rest sag ich nichts.
Struppi.
Hallo.
(bitte jetzt keine Diskussion darüber, das <div>-Tags eleganter wären)
Keine Diskussion. n <div>
sind nur dann eleganter, wenn sie mindestens n+1 <div>
ersetzen.
MfG, at