hallo,bin gerade an einem größeren projekt, nämlich meine bisher relativ lieblos zusammengefrickelte community auf php-basis umzustellen auf einen schönen, objektorientierten entwurf mit perl/cgi.
die grundlagen der objektorientierung sind mir bekannt, allerdings habe ich bis jetzt noch keine webseite so erstellt. deshalb würde ich mein design gerne mal bewerten lassen.
mein login-formular ist in einer datei index.htm. neben username und passwort wird ein parameter site übergeben, der bei jedem aufruf des skripts die jeweilige unterseite markiert.
das formular schickt die daten an die datei index_inside.cgi, die folgendermaßen aufgebaut ist:
#!/usr/bin/perl -wuse strict;
use warnings;
use CGIX;
use CGI::Carp qw(fatalsToBrowser);
my $obj = CGIX->new();
wie man sieht wird hier nur ein konstruktor aufgerufen, der rest wird innerhalb des CGIX-moduls erledigt, welches seinerseits alle methoden des CGI-moduls erbt.
das CGIX-modul sieht so aus:
package CGIX;
use strict qw(@ISA);
use warnings;use DBI;
use CGI;
@ISA = qw( CGI );
sub new () {
my ($classname) = @_;
my $self = {};
#Hash for GET/POST parameters
$self->{%entries} = ();
#global data
$self->{db_hdl};
%entries = &get_parameters;
bless ($self, $classname);
#login
if ($entries{'site'} eq "login") {
login();
#logged in
} elsif ($entries{'site'} eq "home") {
home();
} else {
error(3);
}
}
sub login () {
my $st_hdl;
get_db_handle();
$st_hdl = $db_hdl->prepare("SELECT Pwd FROM users WHERE Nick=?") || error(4);
$st_hdl->execute($entries{'nick'}) ||
error(5);
#passwort überprüfen und session erzeugen, ansonsten fehler werfen
home();
}
sub home () {
print_header();
print $entries{'nick'};
print $entries{'pwd'};
print_footer();
}
sub start () {
print $nick;
print $pwd;
}
sub get_parameters () {
my (@pairs, $pair, $value, $name, $in, %entry);
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $in, $ENV{'CONTENT_LENGTH'}+1);
}
@pairs = split(/&/, $in);
foreach $pair (@pairs) {
# do the special character conversion (%xx)
$pair =~ tr/+/ /;
$pair =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/ge;
# prevent from SSI
$pair =~ s/<!--(.|\n)*-->//g;
($name, $value) = split(/=/, $pair);
if (defined($entry{$name})) {
$entry{$name} .= ":" . $value;
} else {
$entry{$name} = $value;
}
}
return %entry;
}
sub print_header () {
print header();
print start_html(
-title=>'XXXXXXXXXXXXX',
-author=>'XXXXXXXXXXXXX',
-base=>'true',
-target=>'_blank',
-meta=>{
'copyright'=>'copyright XXXXXXXXXXXXXXX'
},
-style=>{
'src'=>'XXXXXXXXXXXXXXX'
}
);
}
sub print_footer () {
print end_html();
}
sub get_db_handle () {
# Connect to MySQL server
$db_hdl = DBI->connect( 'dbi:mysql:XXXXXXXXXXXX', 'XXXXXXXX', 'XXXXXXXX') ||
error(3);
}
sub error () {
print_header();
print "Fehler ".$_." :
print_footer();
die;
}
1;
das ganze ist natürlich erst ein ansatz und tut noch nichts sinnvolles außer name und passwort im klartext auszugeben ;-) sofern site!=login wird natürlich später noch die session überprüft, bevor der code der ausgewählten unterseite erzeugt wird.
mich würde interessieren, ob man mit diesem ansatz sinnvoll weiterarbeiten kann, oder ob es nicht besser wäre, in der index_inside.cgi statt lediglich dem konstruktoraufruf auch weitere teile der programmlogik zu implementieren.
freue mich über jegliche anregungen, kritik und kommentare!
mfg
mario
Datum: 07.12.2006-10:15
