Corso di ASP
parte III
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 nannib@libero.it
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. C
osa succede se si
clicca su un titolo ?
Lo
scopriremo nella prossima puntata…