[precedente] Joe - Copertina - SOffice4-Debian [successivo]

Articoli


NON open

Programmazione CGI - Basi di dati e msqlperl

Il protocollo HTTP associato al linguaggio SQL ha esteso la gestione e l'interrogazione di DataBase a livello mondiale. Soffermiamoci sugli aspetti principali di questa nuova tecnologia in un ambiente di sviluppo facile ma efficace

Una buona installazione di Linux, il Mini SQL 2.0 di Hughes Technologies e la libreria MsqlPerl 1.17, rappresentano un mix formidabile di strumenti per lo sviluppo di applicazioni rivolte all'uso di DataBase via Internet.

Dopo una prima fase in cui affileremo gli ``arnesi del mestiere'', passando dalla compilazione di mSQL all'installazione di MsqlPerl, saremo finalmente pronti per capire come funzionano le query su archivi SQL utilizzando lo scripting CGI.

Un'attenta lettura dei file INSTALL e README, rispettivamente per i due pacchetti software sopra elencati, è raccomandabile per uscire indenni dalle compilazioni.

Purtroppo per motivi di spazio non sarà possibile affrontare in modo sistematico e graduale questo tema, tuttavia, le tecniche che verranno illustrate serviranno come base per creare in proprio vere applicazioni.

Per finire due parole sul software che useremo. Su Linux, beh, penso non ci sai molto da dire: è il migliore!!! :-) mSQL è il nostro RDBMS, ovvero un gestore di DataBase relazionali sql. MsqlPerl, invece, è una libreria di funzioni, che tramite l'uso delle API di mSQL, fornisce la possibilità di gestire gli archivi con gli scripts Perl. Interfacciare il tutto con lo standard CGI sarà poi veramente facile.

COSA OFFRE MSQLPERL

Per iniziare ad usare la libreria MsqlPerl basta l'istruzione Perl ``use Msql'', dopo di che è possibile connettersi a uno o più server mSQL e costruire query mediante un'interfaccia ad oggetti molto semplice. Gli oggetti disponibili sono due: un DataBase handle e uno statment handle. Perl ritorna un oggetto DataBase utilizzando il metodo Connect. In pratica per aprire un DataBase si usa l'istruzione:

$dbh = Msql->connect($hostname,$databasename);
A questo punto si può iniziare con le query usando l'istruzione
$sth = $dbh->query("serie di istruzioni SQL");

Il risultato di una query è sempre una tabella ed i metodi principali per risalire al contenuto o alla struttura di tale tabella sono:

@row = $sth->fetchrow oppure %hash = $sth->fetchhash, ritornano il contenuto di un singolo record della query.
$numrows = $sth->numrows, ricavo il numero di records restituiti dalla query.
$numfields = $sth->numfields, ottengo il numero di campi.
@list => $sth->name, ritorna il nome dei campi della tabella.

Ce ne sono molti altri tutti documentati negli esempi della libreria. Ora siamo pronti per creare una piccola applicazione per la gestione di un archivio contenente nomi, indirizzi e telefoni dei nostri amici.

LA CREAZIONE DI UNA TABELLA

Prima di procedere alla scrittura dello script CGI, si dovrà creare il DataBase AMICI. Basta entrare nella directory contenente i file binari di mSQL (tipicamente /usr/local/Hughes/bin) ed eseguire il comando

msqladmin create AMICI
Poi si passa alla creazione della tabella amici. Si usa il comando ``msql AMICI'' ed al prompt (mSQL>) si immette il comando \e Verrà aperto un editor in cui scriveremo le seguenti linee
create table amici (
  NOME char(30),
  INDIRIZZO char(40),
  TELEFONO char(12)
)

Abbiamo in sostanza scritto una query SQL con cui creeremo la tabella amici composta da tre campi (NOME, INDIRIZZO, TELEFONO) che ospiteranno dati di tipo carattere lunghi rispettivamente 30, 40 e 12. Salviamo il contenuto dell'editor e con il comando \g si eseguirà la query. A questo punto possiamo uscire da mSQL ed iniziare a scrivere nella directory cgi-bin del server http il file amici.cgi.

#!/usr/bin/perl
# abilito l'uso della libreria cgi-lib.pl usata per il parsing CGI
require "cgi-lib.pl";
# uso la libreria msqlperl 
use Msql;
# chiamata alla funzione ReadParse della libreria cgi-lib.pl che decodifica i
# dati di input del form html in un array associativo di nome CGI
&ReadParse(*CGI);
# apro la connessione al database msql AMICI
if ($dbh = Msql->connect("localhost", "AMICI")) {
  &Controlli;
}
else {
  &HTML("Impossibile aprire il DataBase");
}

sub Controlli {
  # controllo il tipo di operazione che sara' eseguita sul database
  if ($CGI{'cerca'}) { &Cerca; }
  if ($CGI{'tutto'}) { &ListaTutto; }
  if ($CGI{'aggiorna'}) { &Aggiorna; }
  if ($CGI{'cancella'}) { &Cancella; }
}

sub HTML {
  # stampa sul browser i messaggi di errore o di avviso
  local($msg) = @_;
  print "Content-type: text/html\n\n";
  print "<HTML>\n<HEAD>\n<TITLE>Risultati</TITLE>\n</HEAD>\n";
  print "<BODY bgcolor=#ffffff>\n";
  print "<H3 align=center>$msg</H3>\n";
  print "</BODY>\n</HTML>\n";
  exit;
}

L'INTERROGAZIONE SUL DB

Lo script amici.cgi permette sia una ricerca mirata delle informazioni e sia una ricerca estesa su tutto il DataBase. Nel primo caso la subroutine &Cerca restituirà tutti i record che soddisfano i criteri di interrogazione forniti nel form html, mentre con &ListaTutto si ottiene un elenco completo e ordinato per nome di tutta al tabella amici. Iniziamo con il codice html:

<HTML>
<HEAD>
<TITLE>DB Amici</TITLE>
</HEAD>
<BODY>
<FORM METHOD=POST ACTION=http://localhost/cgi-bin/amici.cgi>
Ricerca per
<SELECT name=campo>
<OPTION>NOME
<OPTION>INDIRIZZO
<OPTION>TELEFONO
</SELECT><BR>
<INPUT TYPE=text name=valore size=40 maxlength=40>
<INPUT TYPE=submit name=cerca value=Cerca>
<INPUT TYPE=reset name="" value=Cancella><BR>
<INPUT TYPE=submit name=tutto value="Lista tutto">
</BODY>
</HTML>

E poi il codice Perl:

sub Lista {
  # ottengo il numero di record della tabella restituita dalla query
  $records = $sth->numrows;
  if ($records == 0) {
    &HTML("Dato non trovato");
  }
  # apro l'output html
  print "Content-type: text/html\n\n";
  print "<HTML>\n<HEAD>\n<TITLE>Risultati</TITLE>\n</HEAD>\n";
  print "<BODY>\n";
  print "<H2 align=center>Risultati della ricerca</H2>\n";
  print "<CENTER>\n<TABLE border bgcolor=ffffff cellpadding=3>
         <TR><TD><B>NOME</B></TD>
         <TD><B>INDIRIZZO</B></TD>
         <TD><B>TELEFONO</B></TD></TR>\n";
  # stampa i nomi ed i valori dei campi dei record della query 
  while ($i < $records) {
    @field = $sth->fetchrow;
    print "<TR><TD>$field[0]</TD><TD>$field[1]</TD><TD>$field[2]</TD></TR>\n";
    $i++;
  }
  print "</TABLE>\n</CENTER>\n";
  print "</BODY>\n</HTML>\n";
  exit;
}

Alla base di entrambe le ricerche c'è l'enunciato SELECT che nella subroutine &Cerca viene associato all'operatore CLIKE e al carattere speciale %, garantendo la possibilità di effettuare ricerche di sottostringhe ignorando inoltre la differenza tra dati scritti in minuscolo o maiuscolo: una specie di espressione regolare.

Ovviamente possiamo eseguire ricerche per nome, indirizzo o numero telefonico, quindi su tutti e tre i campi della tabella. La clausola ORDER BY NOME ASC, infine, permette la restituzione dei dati in ordine alfabetico e tale ordinamento viene eseguito sul campo NOME.

sub Cerca {
  # ricerca i dati di un amico per nome, per indirizzo o per telefono
  if ($sth = $dbh->query("SELECT * FROM amici WHERE $CGI{'campo'}
      CLIKE '%$CGI{'valore'}%' ORDER BY NOME ASC")) {
    &Lista;
  }
  else {
    &HTML("Impossibile eseguire la ricerca");
  }
}

sub ListaTutto {
  # elenca i dati di tutti gli amici ordinati per nome in senso crescente
  if ($sth = $dbh->query("SELECT * FROM amici ORDER BY NOME ASC")) {
    &Lista;
  }
  else {
    &HTML("Impossibile listare il DataBase");
  }
}

Ricordiamo che l'operatore CLIKE non è compatibile con il linguaggio ANSI SQL.

L'AGGIORNAMENTO DEL DB

Le forme principali di aggiornamento di un DataBase consistono nell'inserimento di un nuovo record in una tabella, oppure nella cancellazione di dati. Nel nostro caso, mediante la subroutine &Aggiorna, forniremo la possibilità di inserire nuovi nomi, indirizzi e numeri di telefono dei nostri amici, mentre con &Cancella si potrà eliminare un intero record inserendo in un form il nome della persona che si desidera cancellare.

Prepariamo quindi il form html:

<HTML>
<HEAD>
<TITLE>DB Amici</TITLE>
</HEAD>
<BODY>
<H3>Aggiornamento DataBase</H3>
<FORM METHOD=POST ACTION=http://localhost/cgi-bin/amici.cgi>
<TABLE>
<TR>
  <TD><B>Nome:</B></TD>
  <TD><INPUT TYPE=text name=nome size=30 maxlength=30></TD>
</TR>
<TR>
  <TD><B>Indirizzo:</B></TD>
  <TD><INPUT TYPE=text name=indirizzo size=40 maxlength=40></TD>
</TR>
<TR>
  <TD><B>Telefono:</B></TD>
  <TD><INPUT TYPE=text name=telefono size=12 maxlength=12></TD>
</TR>
<TR>
  <TD colspan=3><INPUT TYPE=submit name=aggiorna value=Aggiorna>
  <INPUT TYPE=reset name="" value=Cancella></TD>
</TR>
</TABLE>
</BODY>
</HTML>

e poi scriviamo il codice per le due subroutine.

Si noti come le operazioni di inserimento e di cancellazione vengano rispettivamente eseguite usando gli enunciati INSERT e DELETE del linguaggio ANSI SQL.

sub Aggiorna {
  # permette l'inserimeto dei dati di un nuovo amico
  if ($sth = $dbh->query("INSERT INTO amici VALUES ('$CGI{'nome'}',
                                                    '$CGI{'indirizzo'}',
                                                    '$CGI{'telefono'}')")) {
    &HTML("DataBase aggiornato con successo");
  }
  else {
    &HTML("Impossibile aggiornare il DataBase");
  }
}
sub Cancella {
  # cancella i dati di un amico dal db
  $sth = $dbh->query("DELETE FROM amici WHERE NOME='$CGI{'nome'}'");
  &HTML("Dato eliminato con successo");
}

SU INTERNET

L'ultima versione di mSQL può essere scaricata dal sito http://www.Hughes.com.au. Va ricordato che il programma non può essere usato per fini commerciali. In questo caso è necessaria una richiesta scritta da inoltrare alla Hughes Technologies (info@Hughes.com.au).

Per la libreria MsqlPerl http://franz.ww.tu-berlin.de/msqlperl.

di Francesco Munaretto


[precedente] Joe - Copertina - SOffice4-Debian [successivo]