und Arrays ... Was ist falsch?
Leeloo5E
- perl
Hallo,
ich stehe immer mehr auf Kriegsfuß mit Perl. Vor allem was die Behandlung von Arrays, Hashes etc. betrifft.
Nungut. Ich hab also eine DB-Abfrage. Die läuft auch an und sollte mir am Ende ein paar Zeilen ausspucken. Mit fetchrow_array hol ich mir die Zeilen mit den 4 Spalten, um sie dann in einer Tabelle auszugeben. Die bleibt aber leer. Meine Hilfvariable (hab ich vorher mit 0 initialisiert) zählt brav die Anzahl der Ergebniszeilen mit und gibt mir am Ende die richtige Anzahl aus. Nur eben die Tabellenzeilen werden weder gefüllt noch angzeigt.
while (my ($date, $time, $host, $msgonly) = $sth->fetchrow_array){
$hilfe++;
$cgi->Tr( $cgi->td($date),
$cgi->td($time),
$cgi->td($host),
$cgi->td($msgonly));
};## end while
Sieht jemand den Fehler? Ich nämlich nicht.
Ein einfaches print $date etc. gibt mir übrigens die gewünschten Werte aus. Nur im $cgi->td($date); kommt nix.
Gruß,
Leeloo
Nungut. Ich hab also eine DB-Abfrage. Die läuft auch an und sollte mir am Ende ein paar Zeilen ausspucken. Mit fetchrow_array hol ich mir die Zeilen mit den 4 Spalten, um sie dann in einer Tabelle auszugeben. Die bleibt aber leer. Meine Hilfvariable (hab ich vorher mit 0 initialisiert) zählt brav die Anzahl der Ergebniszeilen mit und gibt mir am Ende die richtige Anzahl aus. Nur eben die Tabellenzeilen werden weder gefüllt noch angzeigt.
while (my ($date, $time, $host, $msgonly) = $sth->fetchrow_array){
$hilfe++;
$cgi->Tr( $cgi->td($date),
$cgi->td($time),
$cgi->td($host),
$cgi->td($msgonly));
};## end while
Du gibst auch nichts aus. Die Funktion aus CGI geben nur den Code zurück, print muss du noch dazu machen.
Ich bevorzuge dabei aber die ganze Sache zu sammeln, dann läßt sich das übersichtlicher gestalten.
~~~perl
my @rows;
while (my ($date, $time, $host, $msgonly) = $sth->fetchrow_array){
$hilfe++;
push @rows, $cgi->td( [ $date, $time, $host, $msgonly] );
};## end while
print $cgi->table( $cgi->Tr( \@rows ) );
[/code]
Sieht jemand den Fehler? Ich nämlich nicht.
Ein einfaches print $date etc. gibt mir übrigens die gewünschten Werte aus. Nur im $cgi->td($date); kommt nix.Gruß,
Leeloo
Struppi.
Hallo Struppi,
while (my ($date, $time, $host, $msgonly) = $sth->fetchrow_array){
$hilfe++;
$cgi->Tr( $cgi->td($date),
$cgi->td($time),
$cgi->td($host),
$cgi->td($msgonly));
};## end while
>
> Du gibst auch nichts aus. Die Funktion aus CGI geben nur den Code zurück, print muss du noch dazu machen.
Danke, genau das wars. Das hab ich schon öfters an verschiedenen Stellen vergessen und an dieser ist es mir partout nicht aufgefallen. Vielleicht weil ich das immer gleich mit der Ausgabe assoziere. Deshalb vergesse ich immer print.
>
> Ich bevorzuge dabei aber die ganze Sache zu sammeln, dann läßt sich das übersichtlicher gestalten.
>
> ~~~perl
> my @rows;
>
> while (my ($date, $time, $host, $msgonly) = $sth->fetchrow_array){
> $hilfe++;
> push @rows, $cgi->td( [ $date, $time, $host, $msgonly] );
> };## end while
>
> print $cgi->table( $cgi->Tr( \@rows ) );
>
Sieht auch nicht schlecht aus. Probier ich mal aus. Danke :-)
Gibt es in Perl eine Funktion mit der ich entweder gleich überprüfen kann, ob da überhaupt was von der DB zurückkam oder wieviel? Sowas wie mysql_num_rows. Mein "Perl in a Nutshell" gibt das leider nicht her. Oder ich habs bisher net gefunden.
Gruß,
Leeloo
Gibt es in Perl eine Funktion mit der ich entweder gleich überprüfen kann, ob da überhaupt was von der DB zurückkam oder wieviel? Sowas wie mysql_num_rows. Mein "Perl in a Nutshell" gibt das leider nicht her. Oder ich habs bisher net gefunden.
perldoc DBI (bzw. die HTML doku auf deinem Rechner oder entsprechende Seiten Online)
Die Methode heißt rows, wobei aber:
(aus http://www.oreilly.de/catalog/perldbiger/chapter/
Das Ergebnis dieser Methode ist die Anzahl der Zeilen, die vom letzten Kommando zur Änderung der Datenbank betroffen waren. Die Zahl -1 signalisiert, daß dieser Wert nicht bekannt ist.
Im allgemeinen kann man sich auf diesen Wert nur verlassen, wenn das durchgeführte Kommando kein SELECT-Kommando war. Normalerweise setzen nur Kommandos zur Änderung der Datenbank, wie UPDATE oder DELETE, einen sinnvollen Wert.
Bei SELECT-Queries ist es im allgemeinen nicht möglich, die Anzahl der Zeilen in der Ergebnistabelle vorher zu bestimmen. Die einzige verläßliche Möglichkeit besteht darin, die Tabelle zu lesen und die Zeilen zu zählen. Aus diesem Grund übergeben einige Treiber an dieser Stelle die Zeilennummer der Ergebnistabelle oder den Wert -1. Deshalb raten wir davon ab, die Methode rows oder die Variable $DBI::rows mit SELECT-Abfragen zu verwenden.
Eine bessere Methode ist es, die Datenbank durch ein explizites SELECT COUNT(*) FROM ... die Zeilen zählen zu lassen, wobei man dieselbe WHERE-Klausel verwendet wie für den nachfolgenden Abruf der Daten.
Struppi.