Martin: Mysql Tabelle auslesen und in einem mehrd. Array speichern

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

  1. 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

    1. 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