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



#!/COMMUNITY

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




10.02.2012 / 20:45

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

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




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


BeitragPerl Klassen Frage!
Seitenanfang
Hallo,
ich hebe ein kleines Prob mit Perl.

und zwar habe ich eine Klasse an die ein $dbh als referenz aus der Basis datei übergeben wird nun möchte ich natürlich mit dieser referenz in der Klasse arbeiten ich weise die referenz dann z.b. $self->{'dbh'} zu und möchte so einige SQL aktionen tätigen mir ist bisher leider nur noch nicht klar in wie weit ich in dem package dann noch use DBI einbinden muss ich wahr bisher der Meinung das wenn ich eine eigene Klasse mache in einem föllig abgeschottetem berreich arbeite.
Ich bitte also um hilfreiche tips und ratschläge wie ich das Prob in denn grif bekomme. :-)

Gruß Badgott

Datum: 14.09.2005-15:21

Beitragre: Perl Klassen Frage!
Seitenanfang
Du musst DBI nur da einbinden wo das Datenbankhandle $dbh erzeugt wird.

In den Klassen wo Du das Handle nur verwendest, ist das nicht noetig. Wenn Du dich verschreibst kratzt schlimmstenfalls das Skript ab mit der Meldung

Can't locate object method "Foo" via package "DBI" at deinskript.pl line 1234.

Du rufst also wie gewohnt prepare und die anderen Funktionen auf, nur das Du nicht $dbh->prepare() schreibst sondern eben $self->{'dbh'}->prepare()

Noch ein Tip bzgl. OO - Du solltest Dir eine Klasse schreiben, die alle Datenbankzugriffe erledigt. An die Klassen die Daten aus der DB brauchen uebergibst Du dann dieses Datenbank-Interface-Objekt. Darueber werden dann Accessor-Methoden aufgerufen, die Referenzen auf die Daten an die aufrufenden Klassen zurueckgiben.

Das koennte dann z.B. so aussehen:

my $dbwrap = new dbWrapper();
if ($dbwrap->connectToDb()) {
$classTwo->setDbWrapper($dbwrap);
}
$dbwrap->disconnect();
$classTwo->setDbWrapper(undef);

# In classTwo
sub setDbWrapper {
my $self = shift;
$self->{'dbwrap'} = shift;
}

sub foo {
my $self = shift;
return unless defined $self->{'dbwrap'};
$res = $self->{'dbwrap'}->getSomeDataFromDb();
return unless defined $res;
#mach was mit $res
}

# In dbWrapper
sub getSomeDataFromDb {
my $self = shift;
my $sth = $self->{'dbh'}->prepare($SQL);
return unless defined $sth;
my $res = $sth->execute();
return unless defined $res;
return $sth->fetchall_arrayref();
}

So musst Du, wenn sich an der DB was aendert oder Du das DB-Interface umschreiben willst nur eine Datei (dbWrapper.pm) aendern und nicht alle deine Klassen, die Daten aus der DB verarbeiten, da sich das fuer die anderen Klassen von dbWrapper bereitgestellte Interface wahrscheinlich nicht aendern wird.

Datum: 14.09.2005-23:25

-






-
-