Newsgroup: it.comp.lang.perl
Titolo: Stampa ordinata di qualunque query...

Ciao a tutti..
Ho scritto uno script che, data una qualunque query che gli viene passata,
la esegue sul db e poi scrive il risultato in una tabella.
Poichè non si conoscono a priori il numero e il nome dei campi,
mi comporto così
...
$sth->execute();
while(my $hashref=$sth->fetchrow_hashref()){
  my @campi = keys%{$hashref};
  $cnt++;
  if ($cnt == 1) {
       $result .="<tr>\n";
       $result .="\t<td><b>N°</b></td>\n";
       foreach my $col (@campi) {
          $result .="\t<td><b>$col</b></td>\n";
       }
       $result .="</tr>\n";
  }
  $result .="<tr bgcolor=\"#EFF3FF\">\n";
       $result .="\t<td>$cnt</td>\n";
  foreach my $col (@campi) {
       $result .="\t<td>$hashref->{$col}</td>\n";
       $data_qry{$col}=$hashref->{$col};
  }
  $result .="</tr>\n";
}
Il tutto funziona bene, ma ad ogni esecuzione,
l'ordine delle colonne della tabella è sempre diverso.
Come potrei fare per mantenere l'ordine dei campi dato nella select?
Mille grazie in anticipo.
bye ;-)


usa l'attributo $sth->{NAME} per prendere i nomi dei campi, e visto che ci sei, usalo
PRIMA del loop. :-)
Io uso questa tecnica:
data questa query:
select * from libri where id_libro < 5;
+----------+------------------------------+------+--------+--------+-----------+------------+
| id_libro | titolo                       | anno | pagine | prezzo | id_autore | id_editore |
+----------+------------------------------+------+--------+--------+-----------+------------+
|        1 | Programming Perl 3rd edition | 2003 |   1050 |  90000 |         1 |          1 |
|        2 | Perl DBI                     | 1999 |    330 |  70000 |         2 |          1 |
|        3 | A complete hacker handbook   | 2003 |    190 |  30000 |         3 |          2 |
|        4 | Baudolino                    | 2003 |    560 |  35000 |         4 |          3 |
+----------+------------------------------+------+--------+--------+-----------+------------+
Ecco uno script che fa il lavoro sporco:
use DBI;
use strict;
use CGI::Pretty qw/:standard *table/;
my $dbh = DBI->connect("dbi:mysql:libreria",
     "utente", "password", {RaiseError => 1})
     or die "can't connect\n";
my $query = qq{select * from libri where id_libro < 5};
my $sth = $dbh->prepare($query);
$sth->execute();
print start_table({border => 1});
print Tr(
     map { th( $_ ) } @{$sth->{NAME}}
);
while (my $row = $sth->fetchrow_arrayref()) {
    print Tr(
         map { td(  defined $_ ? $_ : "NULL" ) } @$row
    )
}
print end_table;
Lo script di cui sopra produce questo HTML :
<table border="1">
<tr>
     <th> id_libro </th> <th> titolo </th> <th> anno </th> <th> pagine </th>
     <th> prezzo </th> <th> id_autore </th> <th> id_editore </th>
</tr>
<tr>
     <td>1</td> <td>Programming Perl 3rd edition</td> <td>2003</td> <td>1050</td>
     <td>90000</td> <td>1</td> <td>1</td>
</tr>
<tr>
     <td>2</td> <td>Perl DBI</td> <td>1999</td> <td>330</td>
     <td>70000</td> <td>2</td> <td>1</td>
</tr>
<tr>
     <td>3</td> <td>A complete hacker handbook</td> <td>2003</td> <td>190</td>
     <td>30000</td> <td>3</td> <td>2</td>
</tr>
<tr>
     <td>4</td> <td>Baudolino</td> <td>2003</td> <td>560</td>
     <td>35000</td> <td>4</td> <td>3</td>
</tr>
</table>
Non credi che sia un approccio migliore?
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com


Direi proprio di si, anche se sinceramente non conoscevo CGI::pretty,
e in generale non uso, se non di rado, il modulo CGI.
L'unico piccolo problema è che a me serve mandare questa tabella via mail, 
ma mi arrangerò...
Sicuramente inizierò a usare questo metodo per qualche cgi...
Mille grazie, e complimenti per i tuoi articoli: sei un drago!!!
Bye ;-)