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



#!/COMMUNITY

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




11.02.2012 / 12:02

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


BeitragCGI - Wie konzipiert man's richtig?
Seitenanfang
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 -w

use 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

Beitragre: CGI - Wie konzipiert man's richtig?
Seitenanfang
Was soll das hier genau machen??
 #Hash for GET/POST parameters
$self->{%entries} = ();

Und da Du schön von CGI erbst, ist das hier unnötig:

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;
}

Was Du wahrscheinlich machen willst ist:


my $self->{entries} = {CGI::Vars()};

Datum: 07.12.2006-14:55

Beitragre: CGI - Wie konzipiert man's richtig?
Seitenanfang
ja genau, so dachte ich mir das.

wenn ich es so mache wie du vorschlägst, bekomme ich folgende fehlermeldung:

Can't use an undefined value as a HASH reference at CGIX.pm line 16.

Datum: 07.12.2006-15:38

Beitragre: CGI - Wie konzipiert man's richtig?
Seitenanfang
hm, scheint hier kaum jemanden zu interessieren... gibts wirklich keinen state of the art in sachen design objektorientierter communities?

Datum: 08.12.2006-11:14

Beitragre: CGI - Wie konzipiert man's richtig?
Seitenanfang
Vielleicht solltest Du etwas genauer beschreiben, was Du machen willst.

Man kann z.B. mit CGI::Application sehr schnell CGI-Anwendungen entwickeln...

Ich bin auch eher selten hier. Du kannst ja mal bei Perl-Community.de posten. Da sind wesentlich mehr Leute, die mit CGI zu tun haben, unterwegs...

Datum: 08.12.2006-17:25

-






-
-