Perl - CGI

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Vic
Beiträge: 35
Registriert: 16.03.2006 15:32:27
Wohnort: /home/beerconnection

Perl - CGI

Beitrag von Vic » 16.01.2007 12:26:23

Moin Leute,

ich habe da ein absolut kurioses Problem. Das Perlskript, was ich geschrieben habe, funktioniert auf der Konsole einwandfrei, wenn ich es jedoch über meinen Webbrowser laden möchte, dann verweigert es den Dienst. Die Fehlermeldung besagt, dass die Methode new einer selbstgeschriebenen Klasse nicht gefunden werden kann Oo.

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use modules::Database;
use Digest::MD5 qw(md5 md5_hex md5_base64);

my $dbh = new Database();

my $user = "user";
my $pass = "1234";

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print '<html><head><title>Login</title>';

if ($user && $pass)
{
    my $digest = md5($pass);
    $digest = md5_hex($pass);
    my $sql = "Select * FROM supervisor Where username LIKE \"$user\" AND password LIKE \"$digest\"";
    my @result = $dbh->query($sql);
    
    if (@result)
    {
        print '<meta http-equiv="refresh" content="5; URL=http://myserver/~user/bla.html">';
    }
    else
    {
        print '<meta http-equiv="refresh" content="5; URL=http://myserver/~user/login.pl">';
    }
    print '</head><body>';
}
else
{
    print "</head><body>\n";
    print '<form method="post" action="login.pl">';
    print '<table>';
    print '     <tr><td>';
    print           "Bentuzername: ";
    print '     </td><td>';
    print           '<input type="text" name="username" size="20" maxlength="255">';
    print '     </td></tr>';
    print '     <tr><td>';
    print           "Passwort: ";
    print '     </td><td>';
    print           '<input type="password" name="password" size="20" maxlength="255">';
    print '     </td></tr>';
    print '     <tr><td>';
    print           '<input type="submit" Value="Submit">';
    print '     </td><td>';
    print           '<input type="reset" Value="Reset">';
    print '     </td></tr>';
    print '</table>';
    print '</form>';
}

print "</body></html>\n";
Hat jemand eine Idee?

Viele Grüße

Edit:
Achja hier die Fehlermeldung ^^


Vic

Code: Alles auswählen

Software error:

Can't locate object method "new" via package "Database" at /home/user/public_html/login.pl line 7.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error. 

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 16.01.2007 12:34:03

Hm, wie sieht deine selbstgeschrieben Klasse denn aus?
Wo liegt die Datei, in der deine Klasse drin ist?

Dann noch ein Rat: benutze für HTML-Ausgaben die Funktionen von CGI bzw CGI::Pretty (das macht den HTML-Quellcode auch noch lesbarer als nur CGI). Das macht deinen HTML-Code sauberer.
Wenn es mehr HTML ist empfiehlt sich eventuell auch der Einsatz von HTML::Template bzw. HTML::Template::Compiled.

Vic
Beiträge: 35
Registriert: 16.03.2006 15:32:27
Wohnort: /home/beerconnection

Beitrag von Vic » 16.01.2007 12:36:33

konkret liegt die Klasse in
/usr/lib/perl/5.8/modules/Database.pm

Wie gesagt, wenn ich das Perlskript so mit dem perl Interpreter starte, wird die Klasse auch richtig geladen.
Deshalb geh ich mal davon aus, dass es nicht daran liegt.

Gruß

Vic

Edit:
Man bin ich heute vergesslich...

Code: Alles auswählen

#!/usr/bin/perl -w
#

package Database;

use strict;
use warnings;
use modules::DatabaseB;
use modules::config;

sub new
{
	my $Objekt  = shift;
	my $this = {};
	bless($this,$Objekt);

	$this->{ERROR} = "";
	$this->{USER} = "";
	$this->{PASS} = "";
	$this->{DB}   = "";
	$this->{HOST} = "";
	$this->{DRIVER} = "";
	$this->{DBH} = 0;

    $this->initDB();

	return($this);
}

sub initDB
{
    my $this = shift;

    $this->{USER} = "root";
    $this->{PASS} = "password";
    $this->{HOST} = "localhost";
    $this->{DB} = "db";
    $this->{DRIVER} = "mysql";
    
	$this->{DBH} = DatabaseB->new($this->{USER},
								$this->{PASS},
								$this->{DB},
								$this->{HOST},
								$this->{DRIVER});
}

sub openDB
{
	my $this = shift;
	$this->{DBH}->openDB();
	$this->{ERROR} = $this->{DBH}->errorcheck();
	if ($this->{ERROR})
	{
		return $this->{ERROR};
	}
	else
	{
		return 0;
	}
}

sub query
{
	my $this = shift;
	my $sql = shift;
	$this->openDB();
	if ($this->{ERROR})
	{
		return $this->{ERROR};
	}

	my @result = $this->{DBH}->query($sql);
	$this->{ERROR} = $this->{DBH}->errorcheck();
	
	if ($this->{ERROR})
	{
		return $this->{ERROR};
	}

	$this->closeDB();
	if ($this->{ERROR})
	{
		return $this->{ERROR};
	}

	return @result;
}

return 1;

So hab das mal auf das Wichtigste zusammengekürzt.

Vic
Beiträge: 35
Registriert: 16.03.2006 15:32:27
Wohnort: /home/beerconnection

Beitrag von Vic » 16.01.2007 13:15:26

es geht :)

war ein Rechteproblem
die libs waren zwar dort wo sie hingehörten, aber ohne Leserechte
Warum mir der Interpreter angezeigt hat, dass er new nicht finden kann ist mir schleierhaft.
Ich habe die Kiste mal rebootet und da kam ein ganz neuer Fehler. So bin ich überhaupt darauf gekommen.

Viele Grüße

Vic

Sil53r
Beiträge: 2
Registriert: 16.01.2007 12:19:36

Beitrag von Sil53r » 16.01.2007 13:32:52

Vic hat geschrieben:es geht :)

war ein Rechteproblem
die libs waren zwar dort wo sie hingehörten, aber ohne Leserechte
Warum mir der Interpreter angezeigt hat, dass er new nicht finden kann ist mir schleierhaft.
Ich habe die Kiste mal rebootet und da kam ein ganz neuer Fehler. So bin ich überhaupt darauf gekommen.
Das kann aber eigentlich nicht alles gewesen sein. Fehlende Leserechte sollten ein "Can't locate Database.pm in @INC" o. ä. verursachen.
Hast Du Dein Package eventuell "modules::Database" genannt? Dann matcht

Code: Alles auswählen

use modules::Database;
Andernfalls - wenn es intern nur "Database" heißt - wäre

Code: Alles auswählen

use Database;
richtig. Mit einem "modules::Database" benannten Package ist der Anfangsfehler hier nachvollziehbar.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 16.01.2007 13:51:25

Ein

Code: Alles auswählen

use modules::Database
sucht das Modul Database.pm im Unterverzeichnis modules innerhalb aller Verzeichnisse aus @INC. Wenn Database.pm also in /usr/lib/perl/5.8/modules/ liegt, ist modules::Database schon korrekt.

Zur Sache mit der Fehlermeldung geb ich dir Recht. Wenn die Datei nicht lesbar ist, dann sollte da eigentlich die Meldung kommen, die du nennst.

Antworten