Mysql Tabelle auslesen und in einem mehrd. Array speichern
Martin
- perl
Hallo,
wollte eine Mysql Tabelle auslesen und in einem Mehrdimensionalen Array abspeichern. Um das ganze mal ein bisschen zu verdeutlichen, also davor hab ich die ganzen Daten in einer .txt abgespeichert, als Trennzeichen wurde "|" verwendet. So sahs aus:
in der txt:
id|name|email|comments|icq|date|
in meinem Perlscript, ging es dann folgendermassen weiter:
my @guest_set ;
my $line ;
#Daten werden in aus "gaeste.txt" geholt
open (DAT , "<$dat_file") ;
while ($line=<DAT>) {
#daten in einem Array abspeichern
push ( @guest_set , $line ) ;
}
close(DAT) ;
foreach $line (@guest_set) {
#Bei diesem "|" Trennzeichen wird jedesmal gesplittet und in einem neuen Array abgespeichert
push ( @guest , [ split(/|/ , $line) ] ) ;
}
So entstand bisher immer ein Mehrdimensionaler Array, auf den man dann mit z.B. $guest[1][4] auf einen einzelnen Wert zugreifen konnte.
Jetzt zu meiner Frage, wie schaffe ich es, das eine mysql Tabelle mit folgenden Daten: id, name, email, comments, icq, date , Zeilenweise ausgelesen wird, in einem Array abgespeichert und ich wie zuvor auf jedes einzelne Feld zugreifen kann (will die einzelnen Felder ansprechen, z.B name, email...).
Hab das schon etliches probiert, aber mit nicht sehr viel Erfolg :(
Mfg Martin
Hi Martin,
ich hab zwar kein Array, sondern ein Hash, mit dem ich die Daten über den Feldnamen ansprechen kann, was den code besser lesbar macht,
aber du kannst ja ein Array draus machen.
use DBI;
$db = DBI->connect( 'DBI:mysql:database='.$DB_NAME,
$DB_User,
$DB_PWD,
{
RaiseError => 0,
AutoCommit => 1
}
) || die "Database connection not made: $DBI::errstr";
$sth = $db->prepare( $SQLString ) or die $db->errstr;
$ra = $sth->execute(); # $ra = rows affected or undef in case of error
my $rv = $db->err;
my(@fields) = @{$sth->{NAME}}; # get all fieldnames
my $fc = @fields; # count fields
$rc = 0; # count rows
my $lo; # init.
%QData = undef;
do{
$lo = $sth->fetchrow_hashref; # get record
if ($lo ne ""){
my(%data) = %{$lo};
for (my $a = 0; $a < $fc; $a++){
#print $data{$fields[$a]},"\n";
$QData{$fields[$a]}[$rc] = $data{$fields[$a]};
}
$rc++;
}
} until ($lo eq "");
$db->disconnect();
# Zugriff über $QData{'Feldname'}[$zeile]
Gruss
Egon
Hi Martin,
ich hab zwar kein Array, sondern ein Hash, mit dem ich die Daten über den Feldnamen ansprechen kann, was den code besser lesbar macht,
aber du kannst ja ein Array draus machen.
use DBI;
$db = DBI->connect( 'DBI:mysql:database='.$DB_NAME,
$DB_User,
$DB_PWD,
{
RaiseError => 0,
AutoCommit => 1
}
) || die "Database connection not made: $DBI::errstr";
$sth = $db->prepare( $SQLString ) or die $db->errstr;
$ra = $sth->execute(); # $ra = rows affected or undef in case of error
create global values:
hash %QData = (Column1Name => [@column1Values], Column2Name => [@column2Values], ...);
scalar $rc = rowcount
my $rv = $db->err;
my(@fields) = @{$sth->{NAME}}; # get all fieldnames
my $fc = @fields; # count fields
$rc = 0; # count rows
my $lo; # init.
%QData = undef;
do{
$lo = $sth->fetchrow_hashref; # get record
if ($lo ne ""){
my(%data) = %{$lo};
for (my $a = 0; $a < $fc; $a++){
#print $data{$fields[$a]},"\n";
$QData{$fields[$a]}[$rc] = $data{$fields[$a]};
}
$rc++;
}
} until ($lo eq "");
$db->disconnect();
Zugriff über $QData{'Feldname'}[$zeile]
Gruss
Egon
Hallo Martin,
danke dir vielmals, ist zwar ne andere Lösung, erfüllt aber dennoch einwandfrei ihren zweck :)
Mfg Martin