|
|
 |

|

 |

| Community » CGI: Allgemeines Forum |
|
500, Wieso? ?
|
Seitenanfang |
Also, ich habe vor, mir ein guestbook in Perl zu schreiben, welches auf eine MySQL Datenbank zugreift.Das heißt, Daten schreibt und liest.Beim ausführen des scriptes bekomm ich allerdings eine 500 (Internal Server error). Das script liegt aber im selben verzeichniss, wie die homepage auch (auch in perl - also darf im verzeichniss zu 100% *.pl scripte ausgeführt werden).Ich poste hier gerade mal das script, vielleicht kann mir ja jemand helfen... #!/usr/bin/perl -wuse CGI; &Create_DB_Connection; $name = new CGI; $email = new CGI; $homepage = new CGI; $comment = new CGI; $name->$name->param('name'); $email->$email->param('Email'); $homepage->$homepage->param('Homepage'); $comment->$comment->param('comment'); ($sek, $min, $std, $tag, $mon, $jahr) = localtime(time); $sek = &zwst ($sek); $min = &zwst ($min); $std = &zwst ($std); $tag = &zwst ($tag); $mon = &zwst (++$mon); $jahr = ($jahr + 1900); $datum = ("$tag\.$mon\.$jahr"); print "Content-type: text/html\n\n"; if ($name && $comment) { if ($email && $homepage) { $SQL="INSERT INTO `input` (`name`, `homepage`, `email`, `date`, `comment`) VALUES(\"$name\", \"$homepage\", \"$email\", \"$datum\", \"$comment\");"; &Do_SQL; } if ($email && not $homepage) { $SQL="INSERT INTO `input` (`name`, `email`, `date`, `comment`) VALUES (\"$name\", \"$email\", \"$datum\", \"$comment\");"; &Do_SQL; } if ($homepage && not $email) { $SQL="INSERT INTO `input` (`name`, `homepage`, `date`, `comment`) VALUES (\"$name\", \"$homepage\", \"$datum\", \"$comment\");"; &Do_SQL; } if (!$homepage && $email) { $SQL="INSERT INTO `input` (`name`, `date`, `comment`) VALUES (\"$name\", \"$datum\", \"$comment\");"; &Do_SQL; } print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; print "<html><head><meta http-equiv=\"refresh\" content=\"2;url=http://j-jayz-z.de/hp/guestbook.pl/\"><title>J-jayz-Z Homepage</title></head>"; print "<body><h2>Ihr Eintrag wurde gesichert, sie gelangen nach 2 Sekunden automatisch wieder auf meine Homepage</h2></body></html>"; } else { print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; print "<html><head><title>J-jayz-Z Homepage</title></head>"; print "<body><h2>Sie müssen zumindest Namen und Kommentar eingeben!<br><a href='javascript:history.back()'>Zurück</a></body></html>"; } sub zwst { if ( length ($_[0]) < 2) { return "0".$_[0]; } else { return $_[0]; } } sub Create_DB_Connection{ use DBI; $DSN = "DBI:mysql:db"; $user = "user"; $pw = "passwd"; $dbh = DBI->connect($DSN,$user,$pw) || die "Cannot connect: $DBI::errstr\n" unless $dbh; return; } sub Do_SQL{ eval{ $sth = $dbh->prepare($SQL); }; # End of eval # Check for errors. if($@){ $dbh->disconnect; print "Content-type: text/html\n\n"; print "An ERROR occurred! $@\n"; exit; } else { $sth->execute; } return ($sth); }
Nochwas:der server ist ein linux server und es läuft Apache.Vielleicht hilft das ja weiter... Thx schonmal!
Datum: 30.01.2005-20:10

|
re: 500, Wieso? ?
|
Seitenanfang |
| Wenn ihr es euch anschauen wollt: http://j-jayz-z.de/hp/guestbook.pl das http://j-jayz-z.de/hp/guestbook.pl/ im script führt zu keinem sehr schönen erscheinungsbild;p
Datum: 30.01.2005-20:14

|
re: 500, Wieso? ?
|
Seitenanfang |
| Mach nicht für alles ein eigenes neues CGI-Objekt. Mach nur eins... So liest man Parameter aus einem Formular: http://wiki.perl-community.de/bin/view/Wissensbasis/CGIParameterAuslesen Benutze für die HTML-Ausgabe die Methoden von CGI.pm Warum ein 500er: Lies mal http://wiki.perl-community.de/bin/view/Wissensbasis/FaqCGIServerError500 Zum Fehlerabfangen bei DBI braucht man kein eval, sondern kann $DBI::errstr ausgeben (also $dbh->prepare($sql) or die $DBI::errstr;) oder $dbh->errstr()... Vielleicht auch ganz interessant: http://perl.renee-baecker.de/perl_datenbanken.pdf
Datum: 31.01.2005-13:04

|
re: 500, Wieso? ?
|
Seitenanfang |
| >Mach nicht für alles ein eigenes neues CGI->Objekt. Mach nur eins... Wie meinst du das genau? >So liest man Parameter aus einem Formular: >http://wiki.perl-community.de/bin/view/Wissensbasis/CGIParameterAuslesen Ok, danke.Es ging bis jetzt aber auch immer so.Hab es bis jetzt immer so gemacht! >Benutze für die HTML-Ausgabe die Methoden von CGI.pm Jo, wäre mal eine idee, sich da dran zu setzen und sich das anzuschauen.Hab das so noch nie gemacht.Aber bis jetzt ging es auch immer so... >Warum ein 500er: Lies mal http://wiki.perl->community.de/bin/view/Wissensbasis/FaqCGIServerError500 Zitat von der Page: 1.)z.B. sind evtl. die Rechte der Datei falsch gesetzt; dann hat Perl überhaupt nichts mit diesem Problem zu tun; sind alle richtig gesetzt, hab ich überprüft 2.)oder die Shebang (erste Zeile im Skript) ist falsch und zeigt nicht auf (das richtige) perl. /usr/bin/perl -w stimmt (which perl) außerdem hab ich es immer so gemacht 3.)Oder das Skript kompiliert nicht, d.h. es ist ein Syntaxfehler vorhanden oder ein Modul wird nicht gefunden. root@j-jayz-z.de~>perl -c /var/www/hp/input.pl syntax ok 4.)Das Skript ist im falschen Format, weil es per ftp binär hochgeladen wurde anstatt ascii Hab es direkt in der shell vom server geschrieben.Musste nichts hochladen... 5.)Es kann auch sein, dass das Skript ausgeführt wird, aber dabei passiert ein fataler Fehler, der das Skript sterben läßt - auch dann bekommst du diesen Fehler Ich persönlich habe nichts gefunden... 6.)Du vergisst im Skript, einen Header auszugeben siehst du ja... >Zum Fehlerabfangen bei DBI braucht man kein >eval, sondern kann $DBI::errstr ausgeben >(also $dbh->prepare($sql) or die >$DBI::errstr;) oder $dbh->errstr()... okay, danke.Ich bin, was datenbanken angeht noch frischfleisch;p da ich noch nicht mal volljährig bin und noch nichts mit großen datenbanken im geschäftsleben zu tun hatte, da ich noch zur schule gehe, gibt es da sicher noch einige "schwachstellen" bei mir, was datenbanken angeht... >Vielleicht auch ganz interessant: >http://perl.renee-baecker.de/perl_datenbanken.pdf Okay, ich schaus mir an.Danke! ! ! Aber weiter bin ich immer noch nicht:-(
Datum: 31.01.2005-14:17

|
re: 500, Wieso? ?
|
Seitenanfang |
vielleicht bringt dich use CGI::Carp qw(fatalsToBrowser); weiter
Datum: 31.01.2005-14:21

|
re: 500, Wieso? ?
|
Seitenanfang |
habe ich versucht.genau wie warningsToBrowser... Bringt mich nicht weiter...P.S.:Coole page Steferbo, alles selbst geschrieben? ? ?
Datum: 31.01.2005-14:32

|
re: 500, Wieso? ?
|
Seitenanfang |
| und hat du in der error log mal nachgeschaut? also mit use warnings und use CGI::Carp qw(fatalsToBrowser) habe ich bisher alle "online" fehler gefunden zur not nimm noch use diagnostics, dann wird es noch etwas verständlicher
Datum: 31.01.2005-15:06

|
re: 500, Wieso? ?
|
Seitenanfang |
Das sind die Meldungen aus den Logs, ich kann damit aber nicht viel anfangen... ich seh keine undefinierte subroutine und mit der anderen Meldung bin ich mit meinem latein auch am Ende... Undefined subroutine CGI::CGI=HASH(0x81524cc) at /var/www/hp/input.pl line 11 [Mon Jan 31 21:42:31 2005] [error] [client 217.94.19.109] Premature end of script headers: /var/www/hp/input.pl
Was meint ihr? THX schonmal
Datum: 31.01.2005-21:45

|
re: 500, Wieso? ?
|
Seitenanfang |
und was steht in zeile 11? das hier? (jedenfalls ist das die 11. zeile von deinem script-posting) $name->$name->param('name');ändern in $name=param('name'); und so auch die folgenden zeilen.
Datum: 01.02.2005-07:47

|
re: 500, Wieso? ?
|
Seitenanfang |
>>Mach nicht für alles ein eigenes neues CGI->>Objekt. Mach nur eins... >Wie meinst du das genau?statt:
#!/usr/bin/perl -wuse CGI; &Create_DB_Connection; $name = new CGI; $email = new CGI; $homepage = new CGI; $comment = new CGI;
das hier:
#! /usr/bin/perluse strict; use warnings; use CGI::Carp qw(fatalsToBrowser); use CGI; my $cgi = CGI->new(); # hier wird ein CGI-Objekt erzeugt print $cgi->header(-type => 'text/html'); my $dbh = Create_DB_Connection(); my $name = $cgi->param('name'); # so holt man einen Parameter my $email = $cgi->param('email'); # ... sub Create_DB_Connection{ use DBI; my $DSN = "DBI:mysql:db"; my $user = "user"; my $pw = "passwd"; my $dbh = DBI->connect($DSN,$user,$pw) || die "Cannot connect: $DBI::errstr\n" unless $dbh; return $dbh; } noch ein paar kleine Tipps: wie in meinem Beispiel use strict; verwenden. Warum und was ist dabei zu beachten? siehe http://wiki.perl-community.de/bin/view/Wissensbasis/UseStrictstatt: $sek = &zwst ($sek); $min = &zwst ($min);
das hier: $sek = sprintf("%02d",$sek); $min = sprintf("%02d",$min);
Datum: 01.02.2005-09:18

|
re: 500, Wieso? ?
|
Seitenanfang |
Okay, danke. Wenn ich zuhause bin, teste ich es mal. Ihr seid brudal die freaks ;p thx! ! !
Datum: 01.02.2005-12:23

|
re: 500, Wieso? ?
|
Seitenanfang |
Ich habe es getestet, wie ihr mir es vorgeschlagen habt, außer das mit den Datenbanken, das mach ich mal, wenn ich mehr zeit habe... Das script sieht nun so aus: #!/usr/bin/perl -wuse strict; use warnings; use CGI::Carp qw(fatalsToBrowser); use CGI; &Create_DB_Connection; my $cgi = CGI->new(); my $name->$cgi->param('name'); my $email->$cgi->param('Email'); my $homepage->$cgi->param('Homepage'); my $comment->$cgi->param('comment'); (my $sek, my $min, my $std, my $tag, my $mon, my $jahr) = localtime(time); my $sek = sprintf("%02d",$sek); my $min = sprintf("%02d",$min); my $std = sprintf("%02d",$std); my $tag = sprintf("%02d",$tag); my $mon = sprintf("%02d",++$mon); my $jahr = ($jahr + 1900); my $datum = ("$tag\.$mon\.$jahr"); print $cgi->header(-type => 'text/html'); if ($name && $comment) { if ($email && $homepage) { my $SQL="INSERT INTO `input` (`name`, `homepage`, `email`, `date`, `comment`) VALUES(\"$name\", \"$homepage\", \"$email\", \"$datum\", \"$comment\");"; &Do_SQL; } if ($email && not $homepage) { my $SQL="INSERT INTO `input` (`name`, `email`, `date`, `comment`) VALUES (\"$name\", \"$email\", \"$datum\", \"$comment\");"; &Do_SQL; } if ($homepage && not $email) { my $SQL="INSERT INTO `input` (`name`, `homepage`, `date`, `comment`) VALUES (\"$name\", \"$homepage\", \"$datum\", \"$comment\");"; &Do_SQL; } if (!$homepage && $email) { my $SQL="INSERT INTO `input` (`name`, `date`, `comment`) VALUES (\"$name\", \"$datum\", \"$comment\");"; &Do_SQL; } print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; print "<html><head><meta http-equiv=\"refresh\" content=\"2;url=http://j-jayz-z.de/hp/guestbook.pl/\"><title>J-jayz-Z Homepage</title></head>"; print "<body><h2>Ihr Eintrag wurde gesichert, sie gelangen nach 2 Sekunden automatisch wieder auf meine Homepage</h2></body></html>"; } else { print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'; print "<html><head><title>J-jayz-Z Homepage</title></head>"; print "<body><h2>Sie müssen zumindest Namen und Kommentar eingeben!<br><a href='javascript:history.back()'>Zurück</a></body></html>"; } sub Create_DB_Connection{ use DBI; my $DSN = "DBI:mysql:db"; my $user = "user"; my $pw = "passwd"; my $dbh = DBI->connect($DSN,$user,$pw) || die "Cannot connect: $DBI::errstr\n" unless my $dbh; return; } sub Do_SQL{ eval{ my $sth = my $dbh->prepare(my $SQL); }; # End of eval # Check for errors. if($@){ my $dbh->disconnect; print "Content-type: text/html\n\n"; print "An ERROR occurred! $@\n"; exit; } else { my $sth->execute; } return (my $sth); }
ich bekomme allerdings folgende Meldung:
Software error: Can't call method "CGI=HASH(0x82738c0)" on an undefined value at /var/www/hp/input.pl line 12.
was ist daran falsch? Das script ist genauso übernommen, das heißt, zeile 12 bei mir ist auch zeile 12 im post. perl -c bringt wieder syntax ok. was mach ich falsch?:-(
Datum: 02.02.2005-05:36

|
re: 500, Wieso? ?
|
Seitenanfang |
warum so?
my $name->$cgi->param('name');und nicht so? my $name=param('name') $name ist doch eine ganz einfache variable
Datum: 02.02.2005-07:48

|
re: 500, Wieso? ? Nachtrag!!
|
Seitenanfang |
für die beschriebene übernahme der formulardaten aus param() muss use CGI qw(:standard); verwendet werden
Datum: 02.02.2005-08:10

|
re: 500, Wieso? ?
|
Seitenanfang |
anstatt: my $comment->$cgi->param('comment');das hier: my $comment = $cgi->param('comment'); Das hatte ich aber auch so in meiner Antwort geschrieben...
Datum: 02.02.2005-10:01

|
re: 500, Wieso? ?
|
Seitenanfang |
Okay, danke.Jetzt geht es. Nur noch eine Frage: ich hab in der datenbank folgende felder:id, name, homepage, email, date, commentich will ja ein guestbook schreiben. das sollte dann irgendwie so aussehen: my $dbh = DBI->connect($driver,$user,$passwd) or die $DBI::errstr; $count = 1; my $SQL = "SELECT * FROM guestbook"; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; my @ergebnisse; @inhalt = $sth->fetchrow_array(); $array = @inhalt; while ($count == $array) { $SQL = "SELECT name FROM guestbook WHERE id=\"$count\""; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; $name = $sth->fetchrow_array(); $SQL = "SELECT homepage FROM guestbook WHERE id=\"$count\""; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; $homepage = $sth->fetchrow_array(); $SQL = "SELECT email FROM guestbook WHERE id=\"$count\""; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; $email = $sth->fetchrow_array(); $SQL = "SELECT date FROM guestbook WHERE id=\"$count\""; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; $date = $sth->fetchrow_array(); $SQL = "SELECT comment FROM guestbook WHERE id=\"$count\""; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; $comment = $sth->fetchrow_array(); if ($homepage && $email) { print "<table>"; print "<tr><td width=\"30%\" height=\"10%\"><a href=\"$homepage\">$name</a>(<a href=\"$email\">$email</a>) schrieb am $date:</td></tr><tr><td>$comment</td></tr>"; print "</table>"; print "<br><br>"; } elsif ($homepage && not $email) { print "<table>"; print "<tr><td width=\"30%\" height=\"10%\"><a href=\"$homepage\">$name</a> schrieb am $date:</td></tr><tr><td>$comment</td></tr> "; print "</table>"; print "<br><br>"; } elsif ($email && not $homepage) { print "<table>"; print "<tr><td width=\"30%\" height=\"10%\">$name(<a href=\"$email\">$email</a>) schrieb am $date:</td></tr><tr><td>$comment</td></tr>"; print "</table>"; print "<br><br>"; } elsif (!$email && $homepage) { print "<table>"; print "<tr><td width=\"30%\" height=\"10%\">$name schrieb am $date:</td></tr><tr><td>$comment</td></tr>"; print "</table>"; print "<br><br>"; } ++$count; } aber es gibt keine ausgabe.Wie geasagt. Ich bin newbie und weiß auch nicht, ob ich da einen denkfehler oder besondere "komplikationen" drin habe. Wäre echt nett, wenn ihr mir da nochmal helfen könntet;p THX ! !
Datum: 02.02.2005-21:12

|
re: 500, Wieso? ?
|
Seitenanfang |
| Du machst das zu kompliziert... Und $count wird wohl nie gleich $array sein... mach doch:
my $dbh = DBI->connect($driver,$user,$passwd) or die $DBI::errstr; my $SQL = "SELECT * FROM guestbook"; my $sth = $dbh->prepare($SQL) or die $DBI::errstr; $sth->execute() or die $DBI::errstr; while(my @row = $sth->fetchrow_array()){ #id, name, homepage, email, date, comment print '<table><tr><td width="30%" height="10%">'; print "<a href=\"$row[2]\">" if($row[2]); print $row[1]; print '</a>' if($row[2]); print "(<a href=\"$row[3]\">$email</a>)" if($row[3]); print " schrieb am $date:</td></tr><tr><td>$comment</td></tr>"; print "</table>"; print "<br><br>"; } $sth->finish(); ungetestet...
Datum: 03.02.2005-09:22

|
|

|

|

|
 |

|

|
|