[Linux...ed ora?] [About] [Copertina] [Come farsi un newsfeed]

Articoli



Interfacciamo l'mSQL al Web

Nella scorsa puntata di questo serial sul WWW abbiamo fatto alcune considerazioni riguardo la necessità, in alcuni casi, di affidare i dati ad un gestore di database specializzato e abbiamo esaminato l'mSQL, un piccolo, ma veloce RDBMS interrogabile in SQL.
Abbiamo visto come compilarlo e installarlo, come creare databases e tavole, come popolare di dati le tavole e come interrogare il database.
Abbiamo inoltre creato un piccolo database di nomi e numeri di telefono, che useremo come dati di prova per i programmi che svilupperemo in questo articolo.

Per interfacciare questo RDBMS al Web dobbiamo ovviamente usare il protocollo CGI per far partire un nostro programma che si occupi di interrogare il database e riportare i dati al server http.
Finora abbiamo usato il linguaggio Perl per scrivere i nostri programmi CGI e dopo tutto le cose sono andate abbastanza bene, quindi non vedo il motivo di non continuare. Per interfacciare il Perl all'mSQL abbiamo bisogno di un adattatore, come lo chiama l'autore del modulo.
Il modulo in questione è MsqlPerl-1.10.tar.gz.

L'installazione di questo modulo è molto semplice, come del resto quella di tutti i moduli aggiuntivi del Perl: basta scompattare il file, entrare nella directory creata e dare i seguenti comandi:

$ perl Makefile.PL
$ make
$ su -c 'make install'

A questo punto il modulo aggiuntivo e i relativi manuali saranno installati nelle opportune directory (che il Perl desume dai dati registrati nella sua installazione corrente).
Per interfacciare il nostro programma al server http useremo il modulo CGI::Form, che abbiamo già avuto modo di provare in un precedente articolo (il terzo della serie).

Prima però familiarizziamo con il modulo appena installato e proviamolo scrivendo un programmino stand-alone, che non abbia grosse pretese internettiane, ma che ci possa mostrare i primi rudimenti di programmazione orientata all'mSQL.

Un giro di prova

La cosa più semplice che possiamo fare è di eseguire una query sui dati che giacciono all'interno del nostro DB:

#!/usr/bin/perl

use Msql;

$dbh = Msql->connect;
$dbh->selectdb('prova');
$sth = $dbh->query('select * from indirizzi');
while(@dati = $sth->fetchrow){
	print "@dati\n";
}

Esaminiamo questo programma riga per riga. La prima riga:

use Msql;

richiede al Perl di caricare il modulo che utilizzaremo. La riga:

$dbh = Msql->connect;

crea una connessione con il kernel dell'mSQL, (che altri non è che il demone msqld). La variabile $dbh contiene quindi un handle alla connessione (una reference all'oggetto creato).
La riga successiva specifica all'mSQL il database su cui vogliamo operare:

$dbh->selectdb('prova');

mentre la query vera e propria viene specificata così:

$sth = $dbh->query('select * from indirizzi');

sempre come metodo dell'oggetto che rappresenta la connessione al kernel del database. Questo metodo crea un handle alla query, che viene referenziato dalla variabile $sth.
Le tre righe successive:

while(@dati = $sth->fetchrow){ print "@dati\n"; }

non fanno altro che leggere una riga per volta il contenuto della tavola indirizzi in un array e stamparlo.
Se salviamo questo programma come lettura, lo rendiamo eseguibile (chmod u+x lettura) possiamo lanciarlo con il comando:

$ lettura

e otterremo su standard output:

1 Andrea Bianchi V. dei ciclamini, 42 01 123456
2 Franco Neri V. dei salici, 69 02 234567
3 Mario Rossi V. delle rose, 13 03 345678
4 Filippo Verdi V.le dei pini, 17 04 456789

L'interfacciamento al Web

Proviamo ora a riconsiderare il problema già affrontato nella seconda puntata di questa serie, della ricerca di numeri di telefono in un database, usando come chiave di ricerca i nomi.
All'epoca abbiamo risolto questo problema in modo diverso, usando un semplice file di testo e leggendolo con un programmino in Perl.
Riscriviamo ora quel programma in modo da interrogare un database mSQL.

Usiamo la stessa form usata allora:


<!doctype html public '-//IETF//DTD HTML//EN'>
<!-- Prima prova di form -->

<html>
<head>
<title>Ricerca indirizzi e numeri di telefono</title>
</head>
<body>

<h3><center>Front end per la ricerca di indirizzi e numeri di
telefono nel mio piccolo database di amici</center></h3>
<p>
Inserisci il nome, o parte di questo nel campo e premi
il tasto "Ricerca".
<p>

<form method=post action="http:/cgi-bin/ricerca">
Nome: <input size=25 maxlength=25 name="nome">
<p>

<input type="submit" value="Ricerca">

</body>
</html>

Se salviamo questa form come prova.html nella directory delle pagine HTML, possiamo leggerla nel nostro client usando come indirizzo:

http://localhost/prova.html

Ora dobbiamo scrivere il programma che risponderà alla form:

#!/usr/bin/perl

use Msql;
use CGI::Form;

$query = new CGI::Form;
$nome = $query->param('nome');

$dbh = Msql->connect;
$dbh->selectdb('prova');
$sth = $dbh->query("select * from indirizzi where nome like '%\u\L$nome%'");

print $query->header;
print $query->start_html(-title => 'Risultato della ricerca',
                         -BGCOLOR => "#00A0A0");

while(@dati = $sth->fetchrow){
	$flag = 1;
	print<<EOR;
<b>Nome:</b> $dati[1]<br>
<b>Indirizzo:</b> $dati[2]<br>
<b>Tel.</b> $dati[3]<p>
<hr>
EOR
}

print<<EOF if $flag == 0;
Mi spiace, ma non ho trovato nessuna persona di nome <b>\u\L$nome</b>
nel database.
EOF

print $query->end_html;

Esaminiamo questo programma riga per riga. Le righe:

use Msql;
use CGI::Form;

caricano i moduli che useremo per interfacciarci all'mSQL e al protocollo CGI. Le due righe successive:

$query = new CGI::Form;
$nome = $query->param('nome');

come abbiamo visto nella terza parte di questa serie di articoli, servono per aprire il canale CGI e per leggere il contenuto del campo nome della form nella variabile Perl $nome. Le righe:

$dbh = Msql->connect;
$dbh->selectdb('prova');

sono del tutto identiche alle analoghe del programmino precedente, mentre la successiva:

$sth = $dbh->query("select * from indirizzi where nome like '%\u\L$nome%'");

merita qualche riflessione.
Per chi non è pratico di SQL diciamo subito che l'operatore like serve per esprimere una clausola a cui devono sottostare i record estratti dal database: il campo indicato deve contenere una certa stringa, al cui interno possono essere presenti dei metacaratteri (un po' come l'asterisco nella shell).
Il metacarattere in questione, '%', fa le veci di un qualsiasi numero di caratteri.
Ciò che cerchiamo sono i record il cui campo nome contenga in una qualsiasi posizione la stringa immessa nella form. L'utente potrà quindi immettere il nome o il cognome della persona di cui vuole sapere il numero di telefono.

Il nostro database contiene i nomi e i cognomi con la prima lettera in maiuscolo, quindi dobbiamo fare in modo che la stringa immessa segua questa convenzione. Il modo più semplice di farlo è di far precedere alla variabile $nome le sequenze di escape Perl \u\L.
La sequenza \L rende minuscoli tutti i caratteri della stringa, mentre la sequenza \u, ne rende maiuscolo solo il primo (sì, avete indovinato: \U rende maiuscoli tutti i caratteri della stringa).

Le righe:

print $query->header;
print $query->start_html(-title => 'Risultato della ricerca',
                         -BGCOLOR => "#00A0A0");

stampano l'header HTML della pagina di risposta che ci apprestiamo a scrivere, mentre il ciclo:

while(@dati = $sth->fetchrow){
	$flag = 1;
	print<<EOR;
<b>Nome:</b> $dati[1]<br>
<b>Indirizzo:</b> $dati[2]<br>
<b>Tel.</b> $dati[3]<p>
<hr>
EOR
}

legge riga per riga il risultato della query e stampa i dati.
Osserviamo che se viene trovata almeno una riga, la variabile $flag assume il valore 1. Il valore di questa variabile viene testato all'uscita dal ciclo:

print<<EOF if $flag == 0;
Mi spiace, ma non ho trovato nessuna persona di nome <b>\u\L$nome</b>
nel database.
EOF

per stampare un messaggio nel caso non sia stata trovata nessuna persona rispondente al nome immesso.
L'ultima istruzione:

print $query->end_html;

stampa le righe HTML di fine pagina.

Se salviamo questo programma come ricerca, gli diamo permessi di lettura ed esecuzione per tutti e lo sistemiamo nella directory cgi-bin del nostro server, possiamo provare il funzionamento della form che abbiamo scritto.

Anche questa volta siamo riusciti a fare qualcosa di interessante con poche righe di programma, grazie alla grande potenza espressiva del Perl.

A rileggerci alla prossima puntata.

Per dubbi, congratulazioni, correzioni, insulti & altro scrivete a Nando Santagata.


APPENDICE Il modulo citato si può trovare in uno dei siti del CPAN (Comprehensive Perl Archive Network) di cui vi elenco i siti in Europa:

Austria
ftp://ftp.tuwien.ac.at
Belgium
ftp://ftp.kulnet.kuleuven.ac.be
Czech Republic
ftp://sunsite.mff.cuni.cz
Denmark
ftp://sunsite.auc.dk
Finland (CPAN master site)
ftp://ftp.funet.fi
France
ftp://ftp.ibp.fr
ftp://ftp.pasteur.fr
Germany
ftp://ftp.leo.org
ftp://ftp.rz.ruhr-uni-bochum.de
Greece
ftp://ftp.ntua.gr
Hungary
ftp://ftp.kfki.hu
Poland
ftp://ftp.pk.edu.pl
ftp://sunsite.icm.edu.pl
Portugal
ftp://ftp.ci.uminho.pt
Slovenia
ftp://ftp.arnes.si
Spain
ftp://ftp.etse.urv.es
ftp://ftp.rediris.es
Sweden
ftp://ftp.sunet.se
Switzerland
ftp://ftp.switch.ch
the Netherlands
ftp://ftp.cs.ruu.nl
UK
ftp://ftp.demon.co.uk
ftp://sunsite.doc.ic.ac.uk
ftp://unix.hensa.ac.uk

L'Italia non ha un sito CPAN (qualche volontario?).

Il modulo in questione si trova, a partire dalla directory del CPAN indicata per ogni server, in:

modules/by-module/Msql

di Nando Santagata


[Linux...ed ora?] [About] [Copertina] [Come farsi un newsfeed]