Perl: MySQL Tabelle in Array

ghostadmin

Grand Admiral Special
Mitglied seit
11.11.2001
Beiträge
25.179
Renomée
184
Standort
Dahoam Studios
Ich möchte eine MySQL Tabelle in ein Array bringen. Bekomme keine Fehlermeldung (SQL Verbindung ist auch ok) und der Dump:
print Dumper(\@temp);
bringt keinen Inhalt.

Code:
 my $sth = $dbh->prepare("SELECT clid,src,dst,$cdrcalldate,billsec,disposition,uniqueid,amaflags from $mysql_tablecdr")
            or die "Can't prepare SQL Statement: $DBI::errstr\n";
        $sth->execute()
            or die "Can't execute SQL statement: $DBI::errstr\n";
        my @temp;
        my $row;
        while ( $row = $sth->fetchrow_array() ) {
            push (@temp,$row);
        }
        $sth->finish();
        $dbh->disconnect();

Es wird nicht einmal was ausgegeben wenn ich ausserhalb der Schleife ein
push (@temp, "test");
mache

Was könnte das sein?
 
Vielleicht geht fetchall_arrayref? Hab ich selber aber auch noch nicht genutzt - ich versuche Perl eher zu vermeiden ...
 
Es hätte @row statt $row sein müssen aber das war gar nicht das Problem, es wurde nichts ausgegeben weil ich @temp 2x deklariert hatte wtf

In meinem Skript kann man wahlweise zwischen csv oder mysql als Datenquelle wählen.
csv funktioniert alles und mysql habe ich nachträglich hinzugefügt.
Bei csv kommt nun bei:
print Dumper(@temp[0]);
eine ganze Zeile während da bei Verwendung von mysql nur ein einziges Feld kommt.
Wie kann man obiges zeilenweise ins Array speichern?

Code:
if ($cdrenablemysql eq "1") {

        my $sth = $dbh->prepare("SELECT clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,$cdrcalldate,(calldate+(duration-billsec)) AS answer,(calldate+duration) AS end,duration,billsec,disposition,amaflags,accountcode,uniqueid FROM $mysql_tablecdr ORDER BY $cdrcalldate DESC")
            or die "Can't prepare SQL Statement: $DBI::errstr\n";
        $sth->execute()
            or die "Can't execute SQL statement: $DBI::errstr\n";
        my @row;
        while ( @row = $sth->fetchrow_array() ) {
            push (@temp, @row);
        }
        #my $arrayref = $sth->fetchall_arrayref() or die "Cant fetch: $DBI::errstr\n";
        #foreach (@$arrayref) {
        #    push (@temp,@{$_});
        #}
        $sth->finish();
        

} else {
        open (CDRLOG, "<$cdrfile") || die "cannot open $cdrfile: $!";

        while (<CDRLOG>) { # Load the contents of the file into an array
                if (! (/OMIT/)) {          # If the amaflags are NOT set to OMIT the calls from the CDR, add it to the
                        push (@temp, $_);       # array to be processed.
                }
        }
        close (CDRLOG); # Close the open file
}

Bei unterem Abschnitt vom Code (also ab dem else) bekomme ich das zeilenweise ins Array, wo ist der Unterschied?
 
2D-Array vs. 1D-Array mit String-Wert als Row?
 
1D-Array mit String-Wert als Row?

das ist glaube das was ich brauche, kenne mich mit Array und dem Hash Zeug leider viel zu wenig aus

Angenommen die erste Zeile aus Mysql und dem CSV wäre:
1,2,3,4,5,6
Dann spuckt mir die Variante von Mysql nur 1 aus während CSV die volle Zeile ausgibt mit print Dumper(@temp[0]);
 
Ja, das SQL-Gedöns gibt jede Zeile als Array von den Spalten zurück:

Code:
[['1', '2', '3'],
 ['4', '5', '6'],
 ['7', '8', '9']]

Also ein Array im Array.

Das andere enthält die ganze Zeile wie eingelesen:

Code:
['1 2 3',
 '4 5 6',
 '7 8 9',]

Jedenfalls wenn ich mich nicht furchtbar vertue ...
 
Weiß nicht obs noch umständlicher geht aber jetzt habe ich die ganze Zeile wenn ich folgendes mache:

Code:
foreach (@arrayref) {
my $arr = [ @{$_} ];
push (@temp,$arr);
}

Also String in Array und nicht Array in Array.

Und die komplette Zeile wird nun wie gewünscht ausgegeben mit:
print Dumper(@temp[0]);

Die Werte sind getrennt durch die Stringfolge: ', '

Wenn ich dann einen Split mache um das wieder aufzudröseln und zu verwenden:
Code:
for (my $i=$offset;$i<$numrecords + $offset;$i++) {
@cdrentry = split (/', '/,$temp[$i]);
...
..

funktioniert das allerdings nicht, ein print $cdrentry[0]; gibt das aus:
Code:
ARRAY(0x374be68)
bei der CSV Variante wird dagegen wie gewünscht ein Text ausgegeben, aber wieso?
 
Zuletzt bearbeitet:
Hier nochmal das ganze als Beispiel code
Code:
#!/usr/bin/perl
use strict;
use utf8;
use DBI;
use Config::IniHash;
use Data::Dumper;

my $configfile = ReadINI 'config.ini';

my $mysql_host = $configfile->{mysql}->{host};
my $mysql_db = $configfile->{mysql}->{db};
my $mysql_tablecdr = $configfile->{mysql}->{tablecdr};
my $mysql_user = $configfile->{mysql}->{user};
my $mysql_pwd = $configfile->{mysql}->{pwd};

my $dbh;

my $cdrcalldate = $configfile->{CDR}->{colcdrcalldate};

$dbh = DBI->connect("DBI:mysql:database=$mysql_db;host=$mysql_host",$mysql_user,$mysql_pwd,
{
RaiseError => 1,
mysql_enable_utf8 => 1
}
);
$dbh->do("SET NAMES utf8");
$dbh->do("SET CHARACTER SET utf8");

my $sth = $dbh->prepare("SELECT clid,src,dst,$cdrcalldate,billsec,disposition,uniqueid,amaflags from $mysql_tablecdr")
            or die "Can't prepare SQL Statement: $DBI::errstr\n";
$sth->execute() or die "Can't execute SQL statement: $DBI::errstr\n";
my $arrayref = $sth->fetchall_arrayref() or die "Cant fetch: $DBI::errstr\n";
my @temp;

foreach (@$arrayref) {
        push (@temp,[@{$_}]);
}

$sth->finish();
$dbh->disconnect();

print Dumper(\@temp[0]); #prints 1st row of table

for (my $i=0;$i<10;$i++) {
my @cdrentry = split (/', '/,$temp[$i]);
print $cdrentry[0]; #should print first item of first 10 rows, but prints array(0x....

}

Wie bekomme ich $cdrentry normal ausgedruckt und nicht mit Array(0x.... ?
 
Zurück
Oben Unten