Pubblicato su www.pluto.linux.it
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 files 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ù servers 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 files 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
require "cgi-lib.pl";
use Msql;
&ReadParse(*CGI);
if ($dbh = Msql->connect("localhost", "AMICI")) {
&Controlli;
}
else {
&HTML("Impossibile aprire il DataBase");
}
sub Controlli {
if ($CGI{cerca}) { &Cerca; }
if ($CGI{tutto}) { &ListaTutto; }
if ($CGI{aggiorna}) { &Aggiorna; }
if ($CGI{cancella}) { &Cancella; }
}
sub HTML {
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 {
$records = $sth->numrows;
if ($records == 0) {
&HTML("Dato non trovato");
}
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";
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 i 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 {
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 {
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 {
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 {
$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.
Data creazione HTML: Febbraio 1998
Autore: Francesco Munaretto
E-mail: NoSpam@thank.you