Schrift
[thread]3348[/thread]

Fehler bei fetchall_arrayref

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Optalamia
 2003-10-01 07:25
#34800 #34800
User since
2003-10-01
50 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

bin seit langem mal wieder am Perl programmieren.
Hoffentlich lebt die Community von ehemals perl.de wieder auf!
Danke an die Leute, die das Forum hier wieder neu aufbauen wollen!

Mache gerade erste praktische Versuche mit mysql.
Ich will Daten mit fetchall_hashref() einfangen, bekomme aber folgende Fehlermeldung:

Quote
Can't locate object method "fetchall_arrayref" via package "sth" (perhaps you forgot to load "sth"?) at f:\perl\scripte\feurio_cddb\sql_abfrage.cgi line 215.


wo könnte der Fehler liegen?


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#/usr/bin/perl -w
use strict;
use CGI qw(:standard);
use DBI;
use CGI::Carp qw(fatalsToBrowser);

######### [...]


sub verbindung_zur_datenbank {
# baut Verdindung zur Datenbank auf

my $datasource = "DBI:mysql:database=feurio_cddb;host=localhost";
my $db_user = "sql";
my $db_pass = "sql";

(my $dbh_cd = DBI->connect($datasource, $db_user, $db_pass, {'RaiseError' => 1}) )
|| print "\nFehler beim connect zur Datenbank\n";


return $dbh_cd;
}

######### [...]

my $dbh = verbindung_zur_datenbank(); # $dbh: database handle

my $sth = $dbh->prepare($sql); # $sth: statement handle
$sth->execute();
my $result = sth->fetchall_arrayref(); #>> hier ist Zeile 215

for (my $i=0; $i = @{$result}-1; $i++) { # Zeilen durchlaufen
print "$result->[$i][2]<br>";


}

$sth->finish();
$dbh->disconnect();
format_c
 2003-10-01 10:29
#34801 #34801
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Du solltest aus der Sub nicht das Objkt kopieren, da du nur eine Code-Referenz damit kopierst. Du solltest eher eine Referenz auf das Objekt zurückgeben.

Code: (dl )
return \$dbh_cd;


Das Statementhandle bekommst du dann wenn du das Objekt dereferenzierst:
Code: (dl )
my $sth = $$dbh_cd->prepare($sql) or die DBI::errstr;


Somit ist die Vererbung sichergestellt.

Gruß Alex
Strat
 2003-10-01 11:22
#34802 #34802
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
my $result = sth->fetchall_arrayref();   

Vor dem sth fehlt ein $...
Da ein Objekt eh schon eine Referenz ist, kannst du sie im Gegensatz zu dem, was format_c sagte, auch direkt zurueckgeben, wie du es getan hast.

for (my $i=0;  $i = @{$result}-1; $i++) {  # Zeilen durchlaufen

wuerde ich eher folgendermaszen schreiben:

for my $i (0..$#$result) {  # Zeilen durchlaufen

Auf meiner HP steht unter Tips&Tricks -> MySql mit DBI auch ein kleines DBI-Tutorial, vielleicht interessiert es dich ja...\n\n

<!--EDIT|Strat|1064993064-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Optalamia
 2003-10-04 00:03
#34803 #34803
User since
2003-10-01
50 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das strat-Wort "folgendermaszen" finde ich lustig
- ich wohne in der Wanderslebener Strasze :p

Bekomme jetz keinen Fehler, aber da ist irgendwo ein bug im Script.
Es läuft endlos, reißt die Rechenkapazitäten an sich und läßt sich im Task-Manager nicht killen )-:

Muß ich mir jetzt noch mal anschauen - habe endlich wieder etwas Zeit dafür

Wer gerade nichts zu tun hat, kann auch mal reinschauen:
http://beauty.online.de/pub/sql_abfrage.cgi.txt
Strat
 2003-10-04 00:35
#34804 #34804
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann hole halt nicht alle daten auf einmal ab, sondern zeile fuer zeile...
Code: (dl )
1
2
3
4
5
6
7
while (my $set = $sth->fetchrow_hashref()) {
# mach was mit hashref $set, z.B.
foreach (keys %$set) {
print "$_ => $set->{$_}<br>\n";
}
print "<hr>\n";
} # while

und moeglichst gleich verarbeiten...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Optalamia
 2003-10-04 02:00
#34805 #34805
User since
2003-10-01
50 Artikel
BenutzerIn
[Homepage] [default_avatar]
naja, bei einer Datenbank, die nicht einmal 1 MB groß ist, erwarte ich keine minutenlangen oder endlosen Berechnungen durch das empfangende perl-script ...

aber ich probiere jetzt Deine Variante aus.
Optalamia
 2003-10-04 02:15
#34806 #34806
User since
2003-10-01
50 Artikel
BenutzerIn
[Homepage] [default_avatar]
mein Aufhäng-Problem liegt wohl in diesen Zeilen, denn beim auskommentieren passiert es nicht:
Quote
my $result = sth->fetchall_arrayref(); #>> hier ist Zeile 215

for (my $i=0; $i = @{$result}-1; $i++) { # Zeilen durchlaufen
print "$result->[$i][2]<br>";
}

aber Deine Variante funktioniert auch nicht so recht.
Der erste Datensatz wird ausgegeben, aber dann kommt folgende Fehlermeldung:
Quote
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at f:\perl\scripte\feurio_cddb\sql_abfrage.cgi line 224.


line 224 ist diese:
while (my $set = $sth->fetchrow_hashref()) {
Strat
 2003-10-04 02:41
#34807 #34807
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Optalamia,04.10.2003, 00:15]aber Deine Variante funktioniert auch nicht so recht.
Der erste Datensatz wird ausgegeben, aber dann kommt folgende Fehlermeldung:
Quote
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at f:\perl\scripte\feurio_cddb\sql_abfrage.cgi line 224.
[/quote]
die fehlermeldung sagt aus, dass du versuchst, was von $sth zu lesen, ohne $sth vorher ->execute() zu haben, also hast du wahrscheinlich $sth->execute or die "Errorhandling"; vergessen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Optalamia
 2003-10-04 04:29
#34808 #34808
User since
2003-10-01
50 Artikel
BenutzerIn
[Homepage] [default_avatar]
irgendwie nervt das ...

keine Ahnung, warum das nicht geht.
Ein Fehler bei execute() springt nicht an.
Habe auch die SQL-Anfrage vereinfacht, damit das fehlerfrei sein müßte.
Trotzdem der Fehler.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$sql = "select * from lieder;";

# ORDER BY l.interpret, l.titel;

my $dbh = verbindung_zur_datenbank(); # $dbh: database handle

my $sth = $dbh->prepare($sql); # $sth: statement handle
$sth->execute()
|| die "Content-type: text/html\n\n"
."## Fehler bei execute() ##";

print "## nach execute() ##<br>";
# my $result = $sth->fetchall_arrayref(); # alle Zeilen / Spalten im verketteten Hash
#
# for (my $i=0; $i = @{$result}-1; $i++) { # Zeilen durchlaufen
# print "$result->[$i][2]<br>";
#
#
# }

while (my $set = $sth->fetchrow_hashref()) {
# mach was mit hashref $set, z.B.
foreach (keys %$set) {
print "$_ => " . $set->{$_} . "<br>\n";
} $sth->finish();
print "<hr>\n"; $dbh->disconnect();
} # while

mit Deinem Test-Script geht es - also dann probiere ich noch mal weiter.
Ich hoffe, ich bekomme es die Nacht noch hin.
Immer diese scheinbaren Kleinigkeiten, an denen man scheitert ... äh verzweifelt
Heromaster
 2003-10-04 05:35
#34809 #34809
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
[quote=Optalamia,04.10.2003, 02:29][/quote]
Probiers mal mit folgendem Ansatz

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$sql = "select * from lieder;";
my $dbh = verbindung_zur_datenbank();
my $sth = $dbh->prepare($sql);
$sth->execute() or die "Content-type: text/html\n\n"

while(my @row = $sth->fetchrow_array) {
print @row[2] . '<br>';
}

$sth->finish();
$dbh->disconnect();
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2003-10-01 07:25.