Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Premature end of script headers





Frage

Hallo! Wenn ich mir über ein HTML-Formular die Einträge einer Datenbank mittels folgendem Perl-Skript anzeigen lassen möchte, bekomme ich immer die Fehlermeldung "Premature end of script headers". Wer kann mir sagen, woran dass liegen kann? In der Konsole lässt sich das Skript fehlerfrei compilieren, die Fehlermeldung erfolgt lediglich beim Aufruf über den Browser. Skript: #!e:/perl/Perl/bin/perl -w use strict; use CGI qw (:standard); use CGI::Carp qw (fatalsToBrowser); use DBI; my $DBH; my $STH; my $CGI; my $antwort; $CGI = new CGI(); ###Eintrag oder Anzeige### if($CGI->param("anzeige")){ anzeige($CGI, $DBH, $STH); } elsif($CGI->param("eintrag")){ eintragen($CGI, $DBH, $STH); } ###Start Subroutine Anzeige### sub anzeige{ $DBH = DBI->connect("DBI:CSV:db_aufgabe2=e:/apache/Apache2/cgi-bin") or die "Konnte keine Verbindung zur Datenbank herstellen:$!"; $STH = $DBH->prepare ("SELECT * FROM db_aufgabe2") or die "Konnte SQL-Statement nicht bereitstellen:$!"; $STH->execute() or die "Ausführen nicht möglich:$!"; print <<HERE_TEXT1; Content-type: text/html <html> <head> <title>Datensätze in Datenbank</title> </head> <body> <center> <h1>Datensätze:</h1> <hr> <table border> <tr> <td width="100"><b>Kalenderwoche</b></td> <td width="100"><b>Einheiten</b></td> </tr> HERE_TEXT1 my @data; while (@data = $STH->fetchrow_array()){ my $kalenderwoche = $data[0]; my $einheiten = $data[1]; print qq§<tr>\n<td><b>$kalenderwoche</b></td>\n<td>$einheiten</td>\n</tr>\n§; } print qq§</table>\n<p><a href=\"../aufgabe2_eintrag.html\">Zurück zum Eingabeformular</a></p>\n<hr>\n</center>\n</body>\n</html>§; $STH->finish(); $DBH->disconnect;} ###Start Subroutine Eintragen### sub eintragen{ my ($kalenderwoche, $einheiten) = (param('kalenderwoche'),param('einheiten')); $DBH=DBI->connect("DBI:CSV:db_aufgabe2=e:/apache/Apache2/cgi-bin") or die "Konnte keine Verbindung zur Datenbank herstellen:$!"; $STH=$DBH->do("INSERT INTO db_aufgabe2 VALUES('$kalenderwoche','$einheiten')") or die "Konnte SQL-Statement nicht bereitstellen:$!"; print<<HERE_TEXT2; Content-type: text/html <html> <head> <title>Antwort</title> </head> <body> <h4>Datenbankeintrag</h4> <hr> <p><b>$kalenderwoche</b>, $einheiten</p> <hr> <p><a href=\"../aufgabe2_eintrag.html\">Zurück zum Eingabeformular</a></p> <hr> </body> </html> HERE_TEXT2 $DBH->disconnect;} Besten Dank für eure Hilfe. Gruß Thomas

Antwort 1 von semi

Mach ein Leerzeichen hinter das Ausrufezeichen.

#! e:/perl/Perl/bin/perl -w

Der response header soll die erste Ausgabe im Skript sein!

print <<HERE_TEXT1;
Content-type: text/html

Diese "die ...." Zeilen sind auch zu früh.

Gruß,
Michael


Antwort 2 von thomasN

Hi Michael!

Danke für Deine Antwort.

Habe ein Leerzeichen hinter das Ausrufezeichen gesetzt. Leider funktioniert das Skript dann immernoch nicht. Habe auch schon versucht, ein "\n\n" hinter "Content-type: text/html" zu setzten, leider auch ohne Erfolg.

Warum sind die "or die" Zeilen zu früh, die könnte ich eigentlich doch auch ganz weglassen, sollten halt nur zu meiner Kontrolle dienen.

Was meinst Du mit "der response header soll die erste Ausgabe im Skript sein"?

Sorry, wenn das eine blöde Frage sein sollte, aber bin in Sachen Perl noch ziemlich unerfahren.

Das Skript soll die Einträge von Daten (Kalenderwoche und Auftragseingang in Form von "Einheiten") in eine Datenbank ermöglichen. Dies funktioniert auch.

Dann soll das Skript noch die in der Datenbank enthaltenen Daten in einer Tabelle anzeigen. Dabei taucht halt der Server-Error auf.

Gruß Thomas.



Antwort 3 von semi

Mit dem header meinte ich eigentlich nur das "Content-type: text/html\n\n"

Mach' die Ausgabe von Content-type... direkt hinter die Zeile mit
$CGI = new CGI();

Alles andere in meiner Antwort war falsch. Ich habe wohl zu lange nichts mehr mit Perl zu tun gehabt :-)

Wie auch immer, die Zeilen mit die("...") verursachen den Fehler. Klappt die Datenbankverbindung nicht, dann gibt's den Fehler, den Du genannt hast, da der Header noch nicht ausgegeben wurde.

Hier ein Beispiel:

print "Content-type: text/plain\n\n";
# Ist OK
die("Autsch!");

# Läuft nicht
die("Autsch!");
print "Content-type: text/plain\n\n";

Gruß,
Michael

Antwort 4 von thomasN

Danke für Deine Hilfe, dass Skript war allerdings ok, Fehler lag im HTML-Formular (falscher Parametername). Anfängerfehler, ich weiß, aber manchmal sieht man "vor lauter Bäumen den Wald nicht".
Gruß Thomas

Antwort 5 von triden

Hi,

ich habe auch "Premature end of script headers: test.pl"

hier mein testscriptchen.

#! /usr/bin/perl -w
# search.pl - script
print "Content-type: text/html";

print "
<html>
<head><title>Testseite</title></head>
<body><p>mein inhalt</p></body>
</html>";


führe ich es von der konsole aus, bekomme ich die anzeige als text.
was mache ich denn falsch?

text.pl ist 777 group/user: www/web1
ich habe sogar aus verzweifelung die perl auf 777 gestellt. :-(

Antwort 6 von webbie

"text.pl ist 777 group/user: www/web1
ich habe sogar aus verzweifelung die perl auf 777 gestellt. :-( "

Letzteres ist natürlich großer Blödsinn.
Setze die text.pl auf 755 und group/user auf web1/web1 und achte darauf, dass sich die text.pl im Standard-CGI-Verzeichnis befindet. Ansonsten muss das Verzeichnis in der Konfiguration des Webservers erst für cgi zugelassen werden. Im /cgi-bin sollte das Script aber ohne weitere Maßnahmen einwandfrei laufen.
Gruß
webbie