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 digitfor@gmail.com

 

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 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…

 

I lezione II lezione III lezione IV lezione V lezione VI lezione
             
indietro
avanti