perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 21
Click for quality!




11.02.2012 / 07:34

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitrag500, 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 -w

use 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 500, Wieso? ?
Seitenanfang
vielleicht bringt dich
use CGI::Carp qw(fatalsToBrowser);
weiter

Datum: 31.01.2005-14:21

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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 -w

use CGI;
&Create_DB_Connection;

$name = new CGI;
$email = new CGI;
$homepage = new CGI;
$comment = new CGI;

das hier:

#! /usr/bin/perl

use 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/UseStrict

statt:

$sek = &zwst ($sek);
$min = &zwst ($min);

das hier:

$sek = sprintf("%02d",$sek);
$min = sprintf("%02d",$min);

Datum: 01.02.2005-09:18

Beitragre: 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

Beitragre: 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 -w

use 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 500, Wieso? ?
Seitenanfang
Okay, danke.Jetzt geht es.
Nur noch eine Frage:
ich hab in der datenbank folgende felder:id, name, homepage, email, date, comment

ich 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

Beitragre: 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

-






-
-