Corso di ASP
Parte terza
Metti in linea il tuo catalogo. Impariamo a realizzare un motore di ricerca in grado di interfacciarsi ad un database Access e Sql
Nelle
precedenti lezioni ci siamo avvicinati gradualmente alla sintassi dell’asp,
imparando
a costruire semplici applicazioni, prendendo confidenza con il linguaggio.
Ora
è il momento di passare a qualcosa di più concreto e interessante e quindi
proveremo a
costruire un motore di ricerca che consenta di interagire con un database
remoto via web.
Il nostro progetto si articolerà in due sezioni distinte. La prima parte
prevedere la creazione
di un form (simile al feedback form che abbiamo imparato a creare
nell’ultima puntata) attraverso
la quale l’utente possa immettere dei dati, mentre in un secondo momento
vedremo
come implementare un motore asp che processi le informazioni (queries) e le utilizzi per "prelevare" da un database i dati cercati.
Sembra complicato? Niente paura è più difficile a dirsi che a farsi.
Creare l’interfaccia
Cominciamo
subito con la scrittura del form che servirà all’utente per interagire con
il
database, immaginando di avere un negozio di libri online che consenta di
cercare un
libro in base cercandone i riferimenti in 4 campi: TITOLO, AUTORE,
CATEGORIA, CASA EDITRICE.
I
primi due campi sono testuali e hanno il vantaggio di consentire ricerche
parziali:
se ad esempio inseriamo il riferimento MARIO nello spazio dedicato agli
autori,
il database ci mostrerà tutti i libri il cui autore ha per nome o MARIO;
questo,
ovviamente, è possibile anche per una ricerca per titolo
Per quanto riguarda gli altri due campi, abbiamo deciso di strutturarli come "menu a tendina" con due opzioni:
1. E’ possibile selezionare la parola chiave "Tutte", che consente di visualizzare tutti i valori associati ad un campo (ad es. tutte le case editrici presenti nel database).
2. In alternativa, si può scegliere un singolo valore presente in lista. In questo caso, ad esempio,scegliendo "Urania" si otterrà la lista di tutti i libri dell'Urania Editrice.
Diamo subito un’occhiata al codice html che ci consentirà di visualizzare il form appena descritto:
FORM.HTM
<HTML>
<HEAD>
<TITLE>I NOSTRI LIBRI</TITLE>
</HEAD>
<BODY
BGCOLOR="#C0C0C0"
TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF">
<center>Motore di Ricerca
<form
method="post"
action="motor.asp">
<p><b>TITOLO</b><br>
<textarea
name="titolo"
cols="30"></textarea>
</p>
<p><b>AUTORE</b><br>
<textarea name="autore" cols="30"></textarea>
</p>
<p><b>CATEGORIA</b><br>
<select name="cat">
<option value="tutte">Tutte</option>
<option value="DIRITTO">Diritto</option>
<option
value="FANTASCIENZA">
Fantascienza</option>
</select>
</p>
<p><b>CASA EDITRICE</b><br>
<select name="editrice">
<option value="tutte">Tutte</option>
<option value="CEDAM">Cedam</option>
<option value="URANIA">URANIA</option>
<option
value="MONDADORI">
Mondadori</option>
</select>
<br>
</p>
<p align="center">
<input
type="submit" name="submit"
value="Cerca">
<input
type="reset" name="submit2"
value="Reset">
</p>
</form>
</center>
</BODY>
</HTML>
Costruire la base di dati
L’aspetto
interessante di questo progetto consiste nel non avere
nulla di predefinito: non esistono pagine già pronte che rispondano
ad una ricerca dell’utente.
Al contrario, il motore in asp è
in grado di creare ogni pagina necessaria al momento,
interagendo con le informazioni fornite dall’utente attraverso il form.
Dopo
l’interfaccia utente è ora il caso di esaminare la base di dati.
Un database, in poche parole, è un contenitore nel quale le
informazioni possono essere registrate in forma strutturata.
Nel nostro caso utilizzeremo una struttura tabellare nella
quale alle righe corrispondono i "records" e alle colonne
i "campi". Le informazioni relative ad un libro, ad
esempio, verranno registrate in un record formato dai campi
"Titolo, Autore, Categoria, Casa Editrice, ecc. ecc.".
Il
procedimento di creazione di un file database è notevolmente semplificato
dagli applicativi moderni che consentono di operare in maniera visuale,
diminuendo
i tempi di apprendimento e di realizzazione della base di dati. Per ciò che
ci proponiamo
di fare, Access è lo strumento ideale, semplice ed efficace, ma anche Excel,
DB3 possono essere utilizzati senza problemi.
Vediamo in 9 punti come creare un file Access contenente una tabella nella quale registrare i libri:
1) Lanciate Microsoft Access e scegliete "Database Vuoto".
2) Salvate il database dandogli un nome qualsiasi, ad esempio libri.mdb.
3) Cliccate su Tabelle e poi su Nuovo.
4) Scegliete "Visualizzazione foglio dati".
5) Rinominate le colonne con i nomi dei campi (TITOLO, AUTORE, CATEGORIA, CASA EDITRICE, ANNO, PREZZO,COLLANA, IMM, TESTO).
6) Salvate le modifiche e scegliere un nome per la tabella (ad esempio tablibri)
7) A questo punto Access vi chiederà di definire una chiave primaria (nel nostro caso si tratta di un campo contatore che viene incrementato di un’unità per ogni record inserito in tabella), che servirà ad identificare univocamente i record.
8) Riaprite tablibri e cominciare a "riempiere" i vari record proprio come se fosse un foglio elettronico di Excel.
9) Salvate ed uscite.
Accendiamo il motore
Ora che abbiamo creato il nostro database (libri.mdb) contenente una sola tabella (tablibri) nella quale sono registrate le informazioni relative ai libri che abbiamo inserito inserito, dobbiamo costruire un motore di ricerca che sappia maneggiare i dati.
A
questo proposito, va sottolineato come lavorare sotto Windows NT comporti dei
vantaggi non indifferenti. Grazie all’utilizzo di ADO (Activex Data Objects),
un componente
di Active Server preposto alla gestione dei file (file, directory e database),
è possibile infatti
accedere a qualsiasi informazione, non importa se questa sia contenuta in un
database o in
un messaggio di posta elettronica. ADO, infatti, contiene un’interfaccia
specifica per la connessione
ai database, OLEDB (Object Linking and Embedding per Data Base) la quale
attraverso l’interfaccia
ODBC (Object Data Base Connectivity) in essa contenuta consente di accedere
direttamente
a qualsiasi database senza dovere editare delle routine apposite per ogni tipo
di dati. Riassumendo,
ADO (conosciuto anche come ADODB) è un componente che si occupa
dell’accesso "generico"
ai dati e contiene al suo interno OLEDB e ODBC, che si occupano di gestire
rispettivamente, il primo
i database ad oggetti (non ci addentriamo oltre) ed il secondo i database
relazionali.
Non ci rimane che analizzare il listato relativo al motore di ricerca vero e proprio:
MOTOR.ASP
<HTML>
<HEAD>
<TITLE>I NOSTRI TITOLI</TITLE>
</HEAD>
<BODY
BGCOLOR="#C0C0C0"
TEXT="#0F0000" LINK="#0000FF"
ALINK="#0000CC" VLINK="#0000FF">
<% rem legge dal form
titolo=request.form("titolo")
autore=request.form("autore")
cat=request.form("cat")
ed=request.form("editrice")
In
questo primo blocco di codice osserviamo l’utilizzo dell’oggetto request,
tramite il quale i valori provenienti dai diversi campi del database vengono
associati a variabili;
ad esempio, se l'autore è Pinco Pallo la variabile autore conterrà la
stringa "Pinco Pallo".
if titolo="" then titolo="%"
if autore="" then autore="%"
if cat="tutte" then cat="%"
if ed="tutte" then ed="%"
Con questa serie di direttive viene introdotto un controllo che si occupa di sostituire agli eventuali spazi bianchi lasciati nei form, o al valore "tutte", il simbolo % che in linguaggio SQL (Structured Query Language) significa "Qualunque valore del campo".
sql="select
* from tablibri where titolo
like '%"&titolo&"%' and autore like
'%"&autore&"%'
and cat like '%"&cat&"%' and editrice like
'%"&ed&"%'"
La direttiva che vedete qui sopra può sembrare a prima vista un po’ criptica; vediamo di commentarla. Si inizia con l’assegnare alla variabile sql una stringa di comandi SQL il cui significato è:
SELECT
(seleziona) * (tutti i campi)
FROM (dal) tablibri (la tabella tablibri)
WHERE (nella quale) TITOLO (il campo titolo)
LIKE (è pari a) "%"&titolo&"%" (tutti i valori
+ il contenuto della variabile titolo+tutti i valori)
AND (e) "%"&autore&"%" ecc. ecc.
Inserire i simboli "%" prima e dopo il contenuto della variabile rende possibile la ricerca anche con dati parziali; se all’interno del form inserisco, ad esempio, nel campo AUTORE solo la lettera M, verranno visualizzati i libri scritti da autori i cui nomi iniziano per M.
Set
OBJdbConnection =
Server.CreateObject("ADODB.Connection")
Definisco
OBJdbConnection come un’istanza dell’oggetto
Quest’oggetto informa il server che si sta creando un mezzo per effettuare
una connessione
(attraverso ADO) ad un database.
Il nome del database è il DSN (Data Source Name, cioè:
"nome della sorgente dei dati"), ed è definibile, come
amministratore di sistema, da pannello di
controllo del server NT. Insomma, si può considerare l'oggetto
OBJdbConnection come un telefono, ovvero lo strumento attraverso il quale è
possibile effettuare una chiamata (utilizzando il metodo
OPEN) al DSN.
OBJdbConnection.Open"driver={Microsoft
Access Driver (*.mdb)};
dbq=c:\inetpub\wwwroot\newitalystore\libri\libri.mdb"
Per meglio comprendere il metodo Open paragoniamolo ad una telefonata mentre per il metodo Execute potremmo pensare ad un utente che da un’estremità della connessioni si accinga ad aprire la bocca per parlare. Sempre riprendendo l’immagine della telefonata, le parole che intercorrono fra i due apparecchi sono i dati contenuti nei record, che vengono estrapolati utilizzando il metodo Open: utilizzando l'oggetto OBJdbConnection il metodo Open apre un canale attraverso il quale può passare il flusso di dati proveniente dalla tabella del database.
Il codice da noi usato serve per impostare una connessione DSN-less (senza-DSN), ideale per chi non è amministratore di sistema, dato che in essa vengono specificati il tipo di driver da utilizzare e la directory in cui risiede il file contenente i dati.
Se avessimo usato un DSN avremmo potuto semplicemente scrivere:
OBJdbConnection.Open "libri"
dove
"libri" è un DSN che indica la posizione del database e quale
driver è richiesto per
accedere ai dati. Una connessione di questo tipo, però, ha lo svantaggio di
dovere richiedere
l’intervento dell’amministratore del sistema NT nel momento in cui si
decide di spostare il
database in un’altra, dato che è necessaria, in questo caso, una modifica
del DSN; una
connessione DNS-less ha il vantaggio di non richiedere alcuna modifica, dato
che la directory
di riferimento è già scritta a livello di codice. Un altro sistema che non
richiede alcuna conoscenza del server è:
OBJdbConnection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("libri.mdb")
Però questo sitema "rallenta" un po' il sistema.
Set RS=OBJdbConnection.Execute(sql)%>
Dopo
avere aperto la connessione con l’oggetto OBJdbConnection, si esegue la
query contenuta nella variabile sql utilizzando il metodo Execute.
Impostiamo
RS come un'istanza dell'oggetto OBJdbConnection; quindi se scriviamo,
per esempio, rs("titolo") eseguiamo una query di ricerca sul campo
"titolo".
<%
response.write
("<center><h2>Libri Trovati
L’oggetto
response.write stampa a video i comandi html che generano la tabella.
<%Do
while NOT RS.EOF
</h2><br><table border=1><tr><td>
Numero</td><td align=center>Titolo</td>
<td>Autore</td>
<td>Anno</td><td>Categoria</td>
<td align=center>Casa Editrice</td>
<td>Prezzo</td><td>Collana</td>
</tr>") i=0%>
i=i+1%>
"DO While" "Loop" è un ciclo che dura fino al raggiungimento del RS.EOF, che indica la fine del file (End Of File); per muoversi da un record a quello successivo viene inserita nel ciclo l’istruzione RS.MoveNext.
<TR>
<TD><%=i%></TD>
<td><% id=rs("id")
titolo=rs("titolo")%>
<a
href="libro.asp?ID=<%=id%>">
<%=titolo%></a><br>
</td>
Con
queste righe decidiamo di mettere in una cella il titolo del libro trovato,
recuperandolo da rs("titolo"), che contiene il valore selezionato
dall’oggetto RS nel
campo "titolo" della tabella tablibri.
Da notare, inoltre, che il titolo dell’opera localizzata dalla ricerca
apparirà come
link ad un file libro.asp che esamineremo nella prossima lezione. Inoltre, per
ora,
eviteremo di spiegare perché nella variabile "id" abbiamo inserito
il valore della chiave
primaria (il campo ID contatore) della tabella.
<td><%response.write(RS("autore"))
autore=rs("autore")%></td>
<td><%response.write(RS("anno"))
anno=rs("anno")%></td>
<td><%response.write(RS("cat"))
cat=rs("cat")%></td>
<td><%response.write(RS("editrice"))
ed=rs("editrice")%></td>
<td><%response.write("L. "&RS("prezzo"))
prezzo=rs("prezzo")%></td>
<td><%response.write(RS("collana"))
collana=rs("collana")%></td>
</TR>
<%
imm=rs("imm")
RS.MoveNext
Loop
RS.Close
OBJdbConnection.Close%>
</table>
</BODY>
</HTML>
Infine arriviamo al metodo Close che si occupa di chiudere tutte le operazioni di esecuzione (Execute) e connessione (Connection) al database; in pratica ricollegandoci all’esempio della telefonata, adesso stiamo salutando e abbassando la cornetta.
Riepiloghiamo:
Si
inseriscono delle keyword di ricerca nel form.htm, si preme il tasto CERCA,
il form invia le keyword al motore di ricerca motor.asp che costruisce la
query
(interrogazione) per il database dal quale seleziona i libri con le
caratteristiche
richieste. Infine, viene generata una pagina che visualizza il titolo,
l'autore, la categoria e la casa editrice dei libri trovati.
Il titolo però non è un semplice elemento testuale ma un link al file
libro.asp.