Asp, questi sconosciuti – Corso di asp
parte VI
Impariamo a creare una pagina web dinamica in
asp
di Nanni Bassetti nannib@libero.it
Continua il nostro viaggio nell’affascinante
mondo degli ASP (Active Server Pages) di Microsoft.
Nell’ultima lezione abbiamo visto come
cancellare dei records di un database residente sul server, tramite web,
oggi vedremo come aggiornare ed aggiungere dei record.
Con quest’ultime due funzioni abbiamo
completato l’insieme dei mezzi per gestire un database remoto, sarà
compito vostro creare una pagina dalla quale poter scegliere che tipo di
operazioni fare.
Naturalmente questa pagina sarà accessibile
solo ai possessori di password autorizzata, altrimenti chiunque potrebbe
commettere chissà quali nefandezze sulla vostra base di dati.
La scorsa puntata abbiamo visto che una volta
immessa una password nel form in html, essa viene confrontata con quella
presente nel database della password, se le due combaciano allora si entra
nella pagina dalla quale si possono compiere le operazioni di
cancellazione ed aggiunta di record nel database dei libri (libri.mdb)
altrimenti si torna all' home page.
Vediamo come si aggiorna un record, nello
specifico vediamo come facciamo a cambiare la nostra password
on-line.
Se dalla pagina modifiche.asp clicchiamo su
AGGIORNA PASSWORD, allora viene lanciato il file Update.asp:
Update.asp
<%
REM solita procedura di controllo della
variabile pass per vedere se contiene il valore "ok" altrimenti non si
esegue il codice di update.asp
pass=request.form("pass")
if pass="ok" then%>
<HTML>
<HEAD>
<TITLE>Agiiorna il
Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF" ALINK="#0000CC"
VLINK="#0000FF">
<%
REM la upw assume il valore del campo di tipo
text col name="upw" che sarebbe la nuova password che desidero
usare
upw=request.form("upw")
rem solita procedura di connessione al database
di nome pass.mdb.
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver
(*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri\pass.mdb"
REM qui c’è la novità l’istruzione sql
(Structured Query Language) Update, che serve appunto ad aggiornare un
record.
sql="update pass set pw='"&upw&"' where
id="&request.querystring("id")
REM commentiamola: "Aggiorna la tabella pass
(del db pass.mdb) poni il campo pw uguale al valore contenuto in upw dove
il campo id è uguale al valore della variabile id mandata sulla stringa di
comando dal form.
Set RS=OBJdbConnection.Execute(sql)
rem esegue l’istruzione sql
OBJdbConnection.Close
%>
<center>
<h2>Database Password Aggiornato
!</h2>
premi back per tornare indietro !
</CENTER>
</BODY>
</HTML>
<%
REM se pass fosse stato diverso da "ok" allora
veniva fuori questa scritta !
else
response.write "<h1>Accesso Negato
!</h1>"
end if%>
Naturalmente il sistema di "aggiornamento" del
record può essere esteso anche a più campi e a più records, ad esempio
potremmo aggiornare i campi prezzo e quantità dei record di un database di
articoli del nostro magazzino.
Ma oltre l’aggiornamento il sistema di gestione
remota di un database deve poter anche aggiungere dei records e
allora:
Add.asp
<%
pass=request.form("pass")
if pass="ok" then%>
<HTML>
<HEAD>
<TITLE>Il
Database</TITLE>
</HEAD>
<BODY background="sfondo.gif"
BGCOLOR="#C0C0C0" TEXT="#0F0000" LINK="#0000FF" ALINK="#0000CC"
VLINK="#0000FF">
<%
REM solito sistema per caricare i valori delle
variabili inviate dal form.
titolo=request.form("titolo")
autore=request.form("autore")
cat=request.form("cat")
ed=request.form("ed")
anno=request.form("anno")
prezzo=request.form("prezzo")
collana=request.form("collana")
pagine=request.form("pagine")
testo=request.form("testo")
imm=request.form("imm")
REM una serie di if che controllano se i campi
sono vuoti, per esempio di un libro potremmo avere solo il titolo e
l’autore a questo punto gli altri campi devono assumere dei valori fittizi
come il "-" o lo "0" (per quelli numerici)
if titolo="" then titolo="-"
if autore="" then autore="-"
if ed="" then ed="-"
if cat="" then cat="-"
if anno="" then anno=0
if prezzo="" then prezzo=0
if collana="" then collana="-"
if pagine="" then pagine="-"
if imm="" then imm="-"
if testo="" then testo="-"
rem solita procedura di connessione al database
libri.mdb
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open "driver={Microsoft Access
Driver
(*.mdb)};dbq=c:\inetpub\wwwroot\domini\italystore\libri\libri.mdb"
REM qui c’è la novità, infatti pongo la
variabile RS come oggetto Recordset.
L’oggetto Recordset si usa per creare un set di
records, appunto un insieme di record sul quale lavorare.
L’oggetto Recordset è "l’officina" di ADO
(Active Data Object) (ne abbiamo parlato nelle scorse lezioni), cioè il
posto in cui sono eseguite quasi tutte le attività di gestione del
database.
RS diventa un’istanza dell’oggetto Recordset
quindi può usufruire del metodo Open.
Open apre la tabella "tablibri", sulla
connessione OBJdbConnection (definita in precedenza), i numeri 3,3 che
seguono rappresentano rispettivamente:
- il CursorType
- il LockType
Il CursorType definisce il tipo di "cursore",
il quale è una rappresentazione dei dati (records) e definisce anche il
tipo di viste possibili su di essi.
I tipi di cursori sono di 4 tipi:
- Cursore di default valore:0 è come un cursore statico
ad eccezione del fatto che permette solo spostamenti in avanti e non
indietro, poiché questo cursore non deve tener traccia dei record
aggiunti, modificati o cancellati da atri utenti.
- Cursore Keyset valore: 1 possono vedere le modifiche
apportate da altri utenti, nonché spostarsi tra i record in avanti ed
indietro. Non possono vedere i record aggiunti o cancellati da gli altri
utenti.
- Cursori Dinamici valore:2 possono vedere qualsiasi
cosa: modifiche, aggiunte e cancellazioni fatte da altri utenti.
Supportano, inoltre tutti gli spostamenti.
- Cursori Statici valore: 3 permettono gli spostamenti in
avanti ed indietro. Non sono in grado di rilevare le modifiche ai dati
apportate da altri utenti.
Il valore di LockType (o di BLOCCO) determina
che tipo di blocco il fornitore di dati DBMS (Data Base Management
System), ossia il database realizzato con Access (libri.mdb), deve usare
quando si apre un Recordset, questo ai fini del controllo di concorrenza
sugli accessi ai dati da parte di più utenti
contemporaneamente.
Per definizione le applicazioni client/server
implicano che più di una persona può accedere contemporaneamente ad un
database, questa caratteristica è chiamata concorrenza.
Per un accesso concorrente ci deve essere un
deposito al quale più utenti accedano per leggere e cambiare i
dati.
Ciò significa che il DBMS deve garantire
l’accuratezza dei dati memorizzati e per gestire in modo efficiente un
accesso concorrente ai dati, è necessario fronteggiare un altro problema,
che è chiamato interferenza.
L’interferenza è quel fenomeno che accade
quando due fenomeni della stessa natura si sovrappongono causando un
disturbo reciproco, questo principio è facilmente estensibile all’azione
di due utenti che stiano compiendo la stessa operazione sullo stesso
record di un database.
Per evitare l’interferenza esistono le opzioni
di blocco:
- adLockReadOnly valore: 1 i dati si possono soltanto
leggere.
- AdLockPessimistic valore: 2 i dati sono bloccati appena
qualcuno comincia ad effettuare operazioni di modifica, così da
mantenere un’integrità assoluta dei dati, ma con spiacevoli
rallentamenti del sistema, infatti finché l’utente non finisce le sue
modifiche quei dati sono bloccati. Il blocco pessimistico ha il
vantaggio di essere molto sicuro, specialmente su sistemi come Internet,
che ha la possibilità di far accedere tantissimi utenti
contemporaneamente, ma ha lo svantaggio di creare parecchie difficoltà
su Internet proprio perché qualche utente potrebbe andare a pranzo e
lasciare i records bloccati, oppure i rallentamenti della rete
causerebbero un blocco abbastanza lungo nel tempo ecc. ecc.
- AdLockOptimistic valore: 3 il blocco ottimistico crea
un buffer temporaneo in cui vengono conservati gli aggiornamenti e le
modifiche sui dati, mentre i dati originali sono ancora accessibili agli
altri utenti, quando si lancia un comando di aggiornamento (Update)
allora i dati vengono bloccati e appena finito l’aggiornamento il blocco
viene rilasciato.
Set
RS=Server.CreateObject("ADODB.Recordset")
RS.Open "tablibri",OBJdbConnection,3,3
REM Usiamo il metodo AddNew per immettere il
valore della variabile titolo nel campo "titolo" del database, il valore
della variabile autore nel campo "autore", e così via per tutti gli
altri.
RS.AddNew
rs("titolo")=titolo
rs("autore")=autore
rs("cat")=cat
rs("editrice")=ed
rs("anno")=anno
rs("prezzo")=prezzo
rs("collana")=collana
rs("pagine")=pagine
rs("testo")=testo
rs("imm")=imm
REM dopo aver caricato i valori delle variabili
lanciamo il metodo Update (dato che abbiamo usato il blocco ottimistico)
che serve a bloccare i dati fino a quando non finisce l’aggiornamento.
rs.update
REM a questo punto chiudiamo la connessione col
database e l’apertura del recordset.
RS.Close
OBJdbConnection.Close
%>
<center>
<h2>Database Aggiornato
!</h2>
premi back per tornare indietro !
</CENTER>
</BODY>
</HTML>
<% else
response.write "<h1>Accesso
Negato!</h1>"
end if%>
Riepilogando in queste lezioni abbiamo
visto:
- I comandi basilari dell’ASP (Active Server
Pages)
- Un gestore di feedback form.
- La realizzazione di un motore di ricerca.
- La costruzione dinamica di una pagina html
- Come cancellare dei records da un database via
web
- L’aggiornamento e l’aggiunta dei dati di un database
via web.
Utilizzando questi mezzi si possono inventare e
implementare tantissime applicazioni utili e carine, senza spendere
!
Potete realizzare motori di ricerca, shopping
cart per il commercio elettronico, bacheche su web gestite
automaticamente, web chat, ecc. ecc.
Alcuni esempi (realizzati dal
sottoscritto):
http://www.italystore.com/annunci (inserimento e lettura di annunci
economici)
http://www.giroscopio.com/racconti (inserimento
e lettura di racconti)
http://www.giroscopio.com (motore di
ricerca)
http://www.italystore.com (shopping
cart)
I mezzi sono quelli che vi ho dato manca ancora
un ultimo ingrediente per realizzare quasi tutto:
session.sessionId.
L’oggetto session con il suo metodo sessionId
permette di assegnare ad ogni browser un numero univoco (come un cookie),
quindi se in un listato asp scrivo:
<% x=session.sessionid %>
e poi vado a scrivere il valore della variabile
x in un campo (es. il campo "user") di un database, ovviamente potrò
"personalizzare" alcuni records di quel database.
Questo è molto utile ad esempio nella
realizzazione di uno shopping cart (carrello per gli acquisti
elettronici), infatti quando un cliente sta leggendo dal database i suoi
acquisti non sta facendo altro che leggere tutti i records che hanno nel
campo "user" il suo numero session.sessionid.
È intuitivo che se ci sono due clienti
contemporaneamente uno non vedrà gli acquisti dell’altro proprio perché
ognuno leggerà i suoi records personali.
La stringa sql sarà: "select * from
tabella_acquisti where user="&x
e cioè leggi dalla tabella_acquisti del
database tutti i records che hanno il valore di x nel campo
user.
Facile vero ? No ? Bè con un po’ d’impegno lo
diventerà….ah chiaramente vi consiglio l’acquisto di un buon libro sugli
asp.
Buona Fortuna e buon lavoro
!