Perl - MySQL
Beate Mielke
0 Frank Schoenmann
Hallo Forum,
schoen, dass man hier wieder fragen kann :-)
Ich kriege es einfach nicht hin, select-Anfragen über Perl an MySQL an eine Perl-Variable zu übergeben, und die dann auszulesen.
Das habe ich:
my $dbh = ...
my $sth = $dbh->prepare('select * from TABLE where A="abc" and B="123"');
$sth->execute();
Ich möchte jetzt wissen, was Perl mir als Ergebnis zurückliefert. Z.B. ob das Ergebnis leer ist, also ob "select" eine leere Menge zurueckgeliefert hat, und wenn nicht, mit welchem Befehl kann ich an das Ergebnis herankommen?
Ausserdem koennen die Ergebnisse von Abfrage zu Abfrage ja sehr unterschiedlich ausfallen. Zum Beispiel verschiedene Anzahlen an Zeilen oder Spalten.
Weiß jemand wie das geht?
Viele Grüße
Beate Mielke
hi!
my $dbh = ...
my $sth = $dbh->prepare('select * from TABLE where A="abc" and B="123"');
$sth->execute();Ich möchte jetzt wissen, was Perl mir als Ergebnis zurückliefert.
Z.B. ob das Ergebnis leer ist, also ob "select" eine leere Menge
zurueckgeliefert hat, und wenn nicht, mit welchem Befehl kann ich
an das Ergebnis herankommen?
while (my @data = $sth->fetchrow_array)
{
print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
}
Bei dieser Methode musst du natürlich wissen, in welcher Reihenfolge du die Spalten deiner Tabelle ausgeben lässt, aber das kannst du ja im SELECT-Statement mit angeben: SELECT Spalte3, Spalte5, Spalte1 FROM tabelle.
Statt fetchrow_array kannst du auch noch fetchrow_arrayref und fetchrow_hashref verwenden, die beide eine Referenz zurückgeben, und zwar auf einen Hash oder ein Array. Ich bin mir jetzt nicht ganz sicher, wie das funktioniert. Ungefähr so:
while (my $data = $sth->fetchrow_hashref) { ... }
Jedes $data ist dann eine Referenz auf ein Hash. Um das Hash auszulesen musst du mal in der Perl-Dokumentation die Stellen zur Dereferenzierung durchlesen, kenne ich jetzt nicht auswendig.
bye, Frank!
Hallo Frank,
while (my @data = $sth->fetchrow_array)
{
print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
}
Das klingt ja schonmal sehr vielversprechend. Allerdings habe ich im Moment noch soviele andere Fehlermeldungen, daß ich noch nicht herausfinden kann, ob es läuft.
Statt fetchrow_array kannst du auch noch fetchrow_arrayref und fetchrow_hashref verwenden, die beide eine Referenz zurückgeben, und zwar auf einen Hash oder ein Array. Ich bin mir jetzt nicht ganz sicher, wie das funktioniert. Ungefähr so:
while (my $data = $sth->fetchrow_hashref) { ... }
Muss das hier nicht @data heissen?
Jedes $data ist dann eine Referenz auf ein Hash. Um das Hash auszulesen musst du mal in der Perl-Dokumentation die Stellen zur Dereferenzierung durchlesen, kenne ich jetzt nicht auswendig.
Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.
Viele Gruesse
Beate Mielke
Hallo,
while (my @data = $sth->fetchrow_array)
{
print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
}
Das klingt ja schonmal sehr vielversprechend. Allerdings habe ich im Moment noch soviele andere Fehlermeldungen, daß ich noch nicht herausfinden kann, ob es läuft.
Also bei mir läuft's so ähnlich schon lange... :)
while (my $data = $sth->fetchrow_hashref) { ... }
Muss das hier nicht @data heissen?
Nein, wenn dann wäre es ein "%data" - aber hier bekommst du eine Referenz zurück. Das ist sowas ähnliches wie die Pointer in C, wenn dir das weiterhilft.
Auf den Inhalt kannst du dann mit $$data{"feldname"} zugreifen.
Oder du verwendest "my %data = %{$sth->fetchrow_hashref}" (bewirkt dasselbe wie $dataref = $sth->fetchrow_hashref; %data = %$dataref;), dann hast du einen "normalen" Hash.
Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.
Sorry, ich kenn auch nur die Man-Pages (bei ActivePerl pratischerweise als HTML dabei) und CPAN...
Ciao,
Mirko
Hallo,
while (my @data = $sth->fetchrow_array)
{
print "Spalte 1: $data[0], Spalte 2: $data[1], ...";
Das ist so richtig. Eine andere Variante (bei relativ wenigen Variablen) die ich häufig anwende:
$sth=$db->prepare("SELECT var1, var2, var3... FROM datenbank WHERE ...);
$sth->execute();
while (($var1, $var2, $var3) = $sth->fetchrow_array())
{ und hier die einzelnen Variablen verwenden }
Und wenn Du die Variablennamen analog der Feldbezeichenr in der Datenbank verwendest, brauchst Du nicht soviel über die Indices nachdenken.
Gruß
Timothy
Hallo Beate,
Übrigens, wenn Du eine gute deutsche Dokumentation zu dem Thema kennen solltest, lass es mich bitte wissen.
Ich habe nicht genau verstanden, ob du nach einer Doku zu Referenzen oder zu dem DBI Modul suchst. Für DBI guck doch mal in:
http://www.ora.de/german/perl/perlmod/manpages/dbi.htm
Uli
Hallo Uli,
Ich habe nicht genau verstanden, ob du nach einer Doku zu Referenzen oder zu dem DBI Modul suchst. Für DBI guck doch mal in:
http://www.ora.de/german/perl/perlmod/manpages/dbi.htm
merci beaucoup - endlich mal eine deutsche Anleitung zu so einem komplizierten Thema
viele Gruesse
Beate Mielke
Hi!
Eine perfekte Step-by-Step-Beschriebung findest Du eigentlich unter www.perl-archiv.de . Leider ist die Site heute gerade nicht verfügbar, falls Du möchtest kann ich Dir sie aber als .zip senden, hatte sie mir mal gespeichert.
Gruß Torsten
Hi!
Eine perfekte Step-by-Step-Beschriebung findest Du eigentlich unter www.perl-archiv.de .
Der genaue Link ist http://www.perl-archiv.de/perl/odbc/odbc.shtml
ist zwar eine Beschriebung für Win und Access, funktioniert aber (zumindest was das Perl-Script angeht) auch unter UNIX und mit mySQL.
Gruß Torsten