hallo ceejay,
While( $record_hash = $sth->fetchrow_hashref() ) {
my $ausgabe;
...
foreach $Feld (keys %record_hash) {
»» $ausgabe .= "Feldname: ".$Feld."\tInhalt: ".$record_hash{$Feld}."\n";
»» }'$record_hash' ist _kein_ Hash. Es ist eine Referenz auf ein Hash.
'$record_hash' und '%record_hash' sind zwei verschiedene Dinge.Das ist Dein Problem.
es sollte vielmehr lauten:foreach $Feld (keys %$record_hash)
{
$ausgabe .= "Feldname: ".$Feld."\tInhalt: ".$record_hash->{$Feld}."\n";
}Da sind zwar _nur_ drei Zeichen mehr, aber das machts voll aus.
Andererseits:
mit '$sth->{NAME}' bekommst Du eine Array-Referenz auf die im SQL-Statement verwendeten Felder zurück.
Dadurch könnte es so aussehen (jetz mal ohne Fehlerbehandlung):$sth = $dbh->prepare($sql_statement);
$sth->execute();while ($werte = $sth->fetch_arrayref)
{
my($ausgabe);
for my $idx (0 .. $#{$sth-{NAME} )
{
$ausgabe .= 'Feldname: ' . $sth-{NAME}->[$idx] . "\tInhalt: " . $werte->[$idx] . "\n";
}
}Der Vorteil einer Methode wie dieser ist der, daß die Felder in der richtigen. entsprechend dem Statement angeordneten, Reihenfolge ausgelesen werden, und nicht, wie bei einem Hash, in einer 'zufälligen'.
Außerdem, so hab ich mir sagen lassen, ist's auch schneller, weil das DD-Modul nicht noch extra ein Hash erzeugen muß.(Ich hoffe, ich hab' jetzt nirgendwo einen Tippfehler drin, oder sonst einen Wurm. Hab's wieder mal nicht getestet :-( )
Grüße
Klaus
ahja, eine refrenz - hab ich doch irgendwo schonmal vernommen ... ;)=
jo, sieht gut aus, denke das dürfte das problem lösen - auch wenn och wahrscheinlich eine weile brauchen werde, um dein source zu kapieren *kicher* - übrigens in der DBI MYSQL FAQ auf http://dbimysql.photoflux.com/ gibts zu diesem Zusammenhang gute Ergänzungen - die weitere Fragen aufwerfen *ggG*
da ist zum beispiel ein artikel, in dem "fetchrow_array" gegen "fetchrow_hashref" gesetzt wird, und die zeiten die dabei gemessen wurden sind echt krass ... naja schau selbst:
Output: Benchmark: timing 1000 iterations of array, hashref...
array: 9 wallclock secs ( 3.25 usr + 0.40 sys = 3.65 CPU)
hashref: 20 wallclock secs ( 7.85 usr + 0.49 sys = 8.34 CPU)
Small query, small record set, but well over twice the penalties for hashrefs.
daher die Frage (Wo ist mein MySQL/Perl-Buch ? ;)= ) wie kriege ich die Feldnamen am günstigsten, gibts nicht eine Funktion wie:
while( $Field = fetchrow_fieldid() ) {} ????
es grüßt
c.J.