|
Metti
in linea il tuo catalogo.
Impariamo a realizzare un motore di ricerca in grado
di interfacciarsi ad un database Access e Sql. di
Nanni Bassetti.
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: 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). 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 10 punti come creare un file Access contenente
una tabella nella quale registrare i libri:
1) Lanciate Microsoft Access e scegliete "Database
Vuoto".
3) Salvate il database dandogli un nome qualsiasi,
ad esempio libri.mdb.
4) Cliccate su Tabelle e poi su Nuovo.
5) Scegliete "Visualizzazione
foglio dati".
6) Rinominate le colonne con i nomi dei campi (TITOLO,
AUTORE, CATEGORIA, CASA EDITRICE, ANNO, PREZZO, COLLANA,
IMM, TESTO).
7) Salvate le modifiche e scegliere un nome per la
tabella (ad esempio tablibri)
8) 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.
9) Riaprite tablibri e cominciare a "riempiere"
i vari record proprio come se fosse un foglio elettronico
di Excel.
10) 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
Server.CreateObject("ADODB.Connection").
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
</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%>
L’oggetto response.write stampa a video i comandi
html che generano la tabella.
<%Do while NOT RS.EOF
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. Cosa succede
se si clicca su un titolo ?
Lo scopriremo nella prossima Lezione...
|