Schrift
[thread]3365[/thread]

Can't locate object method...

Leser: 1


<< >> 5 Einträge, 1 Seite
pktm
 2003-10-21 21:54
#35619 #35619
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Also ich weis, dass ich mal mit einer Datenbank gearbeitet habe und dass ich auch mal einfache Statements ausführen konnte.
Nur finde ich die alten Scripten nicht wieder...
Jedenfalls will ich einfach nur zu meiner DB connecten.
Das ist eine MySQL-Datenbank und sie nennt sich Spiel.
Die andere Angabe da ist localhost.
Das würde ich gerne so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
require DBI; # laden des DBI-Moduls
my $db_user   = '';
my $db_passwd = '';
my $dsn = 'DBI:mysql:spiel:localhost';  # datasourcename:  wenn myserver weggelassen wird,
                            # wird standardmäßig localhost verwendet.
my $attributes = { PrintError => 0, RaiseError => 0, "AutoCommit" => 1, }; # siehe Doku zu DBI
my $dbh = DBI->connect($dsn, $db_user, $db_passwd, $attributes)
   #or main::writeDbhError($dbh, "Error in connecting to $dsn", die => 1);
   or main::writeDbhError("Error in connecting to $dsn", die => 1);
 # immer Returncodes und Fehler auswerten!!!

my $table = "spieler";
my $statement = "SELECT name, passwd from $table";
unless ($dbh->do($statement)) {
 main::writeDbhError($dbh, "Error in executing Sql-Statement:\n\t$statement");
}

my $hash_ref = $dbh->fetchrow_hashref;

$dbh->disconnect();


Require deshalb, weil ich das Modul nicht laden möchte, wenn ich es nicht brauche.
Es handelt sich nur um ein einfaches Login-Script.
Jedenfalls kommt jetzt immer der Fehler:
Quote
[Tue Oct 21 19:58:43 2003] login.cgi: Can't locate object method "fetchrow_hashref" via package "DBI::db" (perhaps you forgot to load "DBI::db"?) at login.cgi line 102.
[Tue Oct 21 19:58:43 2003] login.cgi: Database handle destroyed without explicit disconnect at login.cgi line 102.


Ja, letzteres verstehe ich auch nicht so ganz, denn 2 Zeilen drunter steht doch ausdrücklich, dass ich das Statement beende!?

So, Hilfe!
mfg pktm

PS: DBD::mySQL ist übrigens installiert, wie gesagt, ich hab mal vor langer langer Zeit damit gearbeitet...
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2003-10-21 22:13
#35620 #35620
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
fetchrow_hashref kann halt nur auf ein statement-handle angewendet werden, nicht auf
den db-handle. das steht aber auch in perldoc DBI.
ausserdem willst du wahrscheinlich nicht do(), sondern execute() verwenden und dir
davon $sth zurückgeben lassen...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2003-10-21 22:41
#35621 #35621
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gut, also ich habe es jetzt so da stehen:
Code: (dl )
1
2
3
4
5
6
7
my $table = "spieler";
my $statement = "SELECT name, passwd from $table";

my $sth = $dbh->prepare($statement) || die $dbh->errstr;
my $rv = $sth->execute;
my $hash_ref = $sth->fetchrow_hashref;
print "STH:" . Dumper( $sth );


Es kommen keine Fehler mehr.
Jetzt habe ich nurnoch 2 kleine Probleme:
1. ich habe keine Ahnung, was da genau vor sich geht (kann mir das wer Schritt für Schritt erklären?)
2. Die Ausgabe sieht so aus:
print Dumper( $sth ); # $VAR1 = bless( {}, 'DBI::st' );
print Dumper( $rv ); # $VAR1 = 1;

Bin für jede Hilfe dankbar.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
jan
 2003-10-21 22:47
#35622 #35622
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
>print "STH:" . Dumper( $sth );

was willst du damit erreichen? deine ergebnisse von der sql-query stehen in der hashref $hash_ref, wenn welche da sind. ich empfehle
Code: (dl )
1
2
3
4
5
6
7
8
if(my $hash_ref = $sth->fetchrow_hashref)
{
# gibt ergebnisse
}
else
{
# sorry, keine ergebnisse
}
Strat
 2003-10-22 03:04
#35623 #35623
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
in $rv speicherst du den errorcode des execute(), anhand dessen du einen eventuellen fehler ueberpruefen koenntest. Da z.B. MySql beim prepare nur das SQL-Statement auf korrektheit ueberprueft (weiss nicht 100% sicher, ob es in der neuen DBI auch so ist), treten Datenbankfehler da fast immer beim execute() auf, weswegen du dort einen fehler abfangen solltest.

$sth ist ein Statementhandle (ein Unterobjekt von DBI), ueber den du mit den verschiedenen Methoden (fetchrow, fetchrow_hashref, fetchrow_arrayref) die Daten bekommen kannt. Die am haeufigsten dafuer verwendete Syntax ist:
Code: (dl )
1
2
3
4
5
6
while (my $data = $sth->fetchrow_hashref()) {
# mach was mit $data, z.B.
foreach my $field (keys %$data) {
print "$field => $data->{$field}\n";
}
} # while

Wenn man nur eine Zeile auslesen will, verwende ich recht gerne
Code: (dl )
1
2
3
my $arrayRef = $dbh->selectrow_array($statement) or die "Fehler: " . $dbh->errstr; 
# oder:
my $hashRef = $dbh->selectrow_hashref($statement) or die "Fehler: " . $dbh->errstr;

weil man dafuer kein prepare/execute braucht
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 5 Einträge, 1 Seite



View all threads created 2003-10-21 21:54.