Joe - Copertina - SOffice4-Debian |
Articoli
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.
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.
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 AMICIPoi 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; }
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.
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"); }
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
.
Joe - Copertina - SOffice4-Debian |