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
</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.

 


primaparte | secondaparte | terzaparte | quartaparte | quintaparte | sestaparte