| |
|
| |
|
| |
|
ASP
& ADO
Introduzione |
Le Active Server Pages sono pagine web dinamiche
eseguite su un sistema Windows Server e Web Server IIS (Internet
Information Services).
Una pagina ASP puo contenere testo, HTML, XML, script in VBS (Visual
Basic Scripting) o JS (Java Scripting), gli script sono ovviamente
differenti dai Javascript che vengono eseguiti dalla JavaVirtualMachine
sul sistema del visitatore, questi script infatti sono eseguiti
dal server, prendono infatti il nore di Server-Side Scripts.
Il fatto che il server invii la pagina solo dopo aver eseguito
lo script permette di creare vere e proprie applicazioni senza preoccuparsi
che il codice sia in qualche modo visibile all'utente.
Ovviamente scrivendo un codice non sicuro è possibile che
la pagina non risponda come dovrebbe, un tipico errore è
la routine di controllo dei dati inseriti dall'utente. Riprenderemo
il discorso della sicurezza con un esempio piu avanti.
Il vantaggio di creare una serie di pagine dinamiche anziche statiche
è molto semplice:
- Gestione del sito
- Aggiornamento del sito
- Interattività con visitatori
- Ricerche efficaci
Questo network di siti è in gran parte scritto in ASP proprio
per i motivi suddetti.
Le pagine ASP hanno accesso ad una serie di oggetti come l'accesso
a file (lettura/scrittura), a database (Access e ADO), ai form,
alle sessioni (ogni utente crea una sessione univoca temporanea
per la durata della connessione, viene usato per i login e per l'eCommerce),
ovviamente è possibile scrivere stringhe nella pagina.
Questo breve documento non vuole spiegare il linguaggio ASP, ma
concentrasri sulla strana intesa MySQL e ASP.
L'SQL (Structured Query Language) è un linguaggio ANSI standard
per l'accesso a database (Oracle, DB2, Sybase, Informix, Microsoft
SQL Server, Microsoft Access, MySQL).
Le pagine ASP solitamente sono usate in relazione a un Database
Access o al limite Microsoft SQL Server, di fatto tutto su piattaforma
Microsoft.
E' possibile comunque tramite l'oggetto ADO e il driver MySQL accedere
anche ad un database su server linux da una pagina ASP su un Web
Server Windows.
ADO (ActiveX Data Objects ) è un oggetto che gestisce l'accesso
ai database dalle pagine ASP.
La lista ordinate di eventi sul questo oggetto è:
- Creare una connessione ADO ad un database (file o server)
- Aprire la connessione (Open)
- Creare un oggetto ADO RecordSet (paragonabile ad una tabella)
- Aprire il RecordSet (Open)
- Estrarre i dati dal databae
- Chiudere il RecordSet (Close)
- Chiudere la connessione (Close)
|
| |
|
| |
|
|
|
|
Semplice Esempio
di connessione ADO ad un server MySQL |
Vengono creati in runtime gli oggetti
per la connessione al database e per la lettura dei dati.
set adoConn = Server.CreateObject("ADODB.Connection")
set adoRS = Server.CreateObject("ADODB.Recordset")
Quindi viene inizializzata la connessione, in questo caso ad un
server (locale) MySQL.
adoConn.Open "driver={MySQL};server=127.0.0.1;port=3306;database=SqlDB1;uid=root;pwd=MyPwD;option=16387"
Quindi viene associato il RecordSet alla connessione ADO appena
creata.
adoRS.ActiveConnection = adoConn
Si controlla che non ci siano errori:
if adoConn.errors.count = 0 then ..
Quindi possiamo selezionare la tabella tramite il metodo Source
dell'oggetto Recordset:
adoRS.Source = "SELECT * FROM
table1 ORDER BY eta DESC, nome
ASC"
Le parole in grassetto sono comandi, table1 è una delle
tabelle del database (già selezionato a priori con l'oggetto
AdoConn), eta e nome sono campi della tabella. L'asterisco indica
"tutti i campi". Ecco la spiegazione della riga di comando:
Seleziona tutti i campi nella tabletta table1 ordinati per eta
descrescente e poi per nome ascendente (alfabetico).
adoRS.Open
Apre il RecordSet e permette di leggere o scrivere i dati. Viene
selezionato il primo record (se la tabella non è vuota)
Quindi c'è il loop While - WEnd che legge ogni singola riga
del recordset:
While adoRS.EOF then
Response.Write(adoRS("nome") &
adoRS("cognome") & " - " & adoRS("eta")
"<br>")
adoRS.MoveNext
WEnd
adoRS.EOF è una proprietà del RecordSet che è
vera quando il record (la riga) selezionata è l'ultima. Sarebbe
il corrispettivo del vecchio accesso ai file in C, EOF infatti stà
per End Of File.
Il loop quindi viene eseguito dal primo all'ultimo record, tramite
l'oggetto "Response" e il metodo Write è possibile
scrivere stringhe nella pagina.
Ad ogni esecuzione del corpo del ciclo viene scritta una riga e
poi il comando adoRS.MoveNext fa passare il puntatore corrente al
successivo record.
Infine sono chiusi sia il RecordSet che la connessione:
adoRS.Close
adoConn.Close
Propongo ora un esempio più complesso, una pagina che reindirizza
la pagina dopo aver aggiornato il numero di download in un database.
Vengono passati due parametri: query (il numero univoco che identifica
il link) e sec (la sezione in cui è contenuto il link, nel
DB corrisponde al nome della tabella), lo scopo del codice è
aggiornare il campo "clicks" aggiungedo 1 e indirizzare
la finestra al link selezionato.
<%@ Language=VBScript %>
<%
dim currsec, query, link, title, clicks
query = Request.QueryString("query")
query=CInt(query)
currsec = Request.QueryString("sec")
clicks = 0
dim adoConn
dim adoRS
set adoConn = Server.CreateObject("ADODB.Connection")
set adoRS = Server.CreateObject("ADODB.Recordset")
adoConn.Open " ....."
adoRS.ActiveConnection = adoConn
if adoConn.errors.count = 0 then
adoRS.CursorLocation = 3
adoRS.CursorType = 1
adoRS.LockType = 3
adoRS.Source = "SELECT * FROM " & currsec &
" WHERE id=" & query
adoRS.Open
if adoRS.EOF then
Response.Redirect("error.asp")
adoRS.Close
adoConn.Close
else
link = adoRS("url")
title = adoRS("sitename")
clicks = CInt(adoRS("clicks"))
adoRS("clicks") = clicks + 1
adoRS.UpDate
adoRS.Close
adoConn.Close
Response.Redirect(link)
end if
end if
%>
<html>
<head>
<title>Redirecting.. <% =title%></title>
</head>
<body>
</body>
</html>
La difficoltà del codice non necessita di spiegazione aggiuntive.
Nota: questo codice dovrebbe essere più robusto a possibili
errori nei parametri. (es: if query = "" or sec = ""
then....) |
| |
|
| |
|
|
|
|
Un esempio più complesso:
ASP, Form, Invio Main, ADO, MySQL |
Questo esempio comprende molte caretteristiche
interessanti, è la pagina che invia la mail dimenticata di
un utente registrato su eWorld Network, la pagina è raggiungibile
qui.
<%@LANGUAGE="VBSCRIPT"%>
<%
Option Explicit
Response.Buffer=True
Response.CacheControl="Private"
Response.Expires=-100000
%>
La prima riga specifica il linguaggio predefinito della pagina:
Visual Basic Scripting (da notare che è necessario inserire
il carattere speciale @).
Quindi vengono impostate alcune proprietà della pagina:
Option Explicit specifica che è necessario
dichiarere tutte le variabili. Questo riduce il tempo di esecuzione
della pagina e rende il codice pià sicuro dagli errori di
programmazione.
Response.Buffer, se vero, fa in modo che la pagina
non venga scritta tutta alla fine dell'esecuzione degli script;
quindi ipotizzando una fila di Response.Write("ciao")
non saranno scritti uno alla volta ma tutti insiema alla fine. Anche
questo è un sistema per ridurre il tempo di esecuzione.
Response.CacheControl viene impostato come privato
perché si tratta di dati personali e password, la pagina
non viene salvata in cache, il comando successivo Response.Expires
indica che la pagina deve essere aggiornata completamente
ogni volta.
dim usern
usern = ""
usern = Request.QueryString("username")
L'oggetto Request permette di accedere tramiti il metodo QueryString
ai parametri passati alla pagina. I Form creano la sintassi automaticamente
a seconda dei vari input e delle proprietà del form, comunque
ricordo la sintassi:
pagina_web_dinamica.asp?parametro1=valore1¶metro2=valore2&
...
Quindi nella variabile usern sarà memorizzato il valore
del parametro "username" passato alla pagina, è
bene inizializzare sempre il valore prima di leggere il parametro.
Segue la spiegazione della parti salienti del codice, in generale
mi sembra auto-esplicativo:
Set link = CreateObject("CDONTS.Newmail")
link.From = "admin@ewgate.net"
link.To = mail
link.Subject = "Dati Account - " & usern & "[eWGate.Net]"
link.Body = "Welcome eWorld Network." & vbNewLine
& "I tuoi dati sono:" & vbNewLine & "Username:
" & usern & ......
link.Send
Set link = Nothing
sent = true
CDONTS.Newmail è l'oggetto che ci permette di inviare mail
tramite il Mail Server predefinito del Web Server.
Si puo notare che l'oggetto viene creato, vengono impostate le proprietà
principali, il corpo del messaggio, quindi viene inviato il messaggo
e si distrugge l'oggetto. |
| |
|
| |
|
|
|
|
Gestione Percorsi dei Files |
L'oggetto Server oltre a molte altri
metodi e proprietà ne formisce una essenziale per accedere
ai file:
dir_full_path = Server.MapPath(relative_directory)
Questo metodo ritorna una stringa contentente l'indirizzo (percorso)
completo della directory passata come parametro, ad esempio se la
pagina ASP eseguita è all'indirizzo:
"http://www.ewgate.net/research/papers/" e se il file
a cui vogliamo accedere è nella directory "http://www.ewgate.net/nfo/res/"
:
dim
dir_full_path,
relative_directory
relative_directory = "../../nfo/res"
dir_full_path = Server.MapPath(relative_directory)
La variabile dir_full_path conterrà la stringa "http://www.ewgate.net/nfo/res/".
Riporto un esempio simile al contatore di downloads visto nella
sezione sull'accesso a database, in questo caso alla pagina vengono
passati 3 parametri: category e section (cioè la categoria
e la sezione della risorsa) e il numero univoco che contraddistingue
la risorsa.
La posizione delle risorse è: ./ category / section
/ mentre nel database diciamo che c'è una tabella con il
nome della sezione.
<%@ Language=VBScript %>
<%
dim currsec, query, link, filename, title, clicks
query = Request.QueryString("query")
query=CInt(query)
currsec = Request.QueryString("sec")
currcat = Request.QueryString("cat")
clicks = 0
dim adoConn
dim adoRS
set adoConn = Server.CreateObject("ADODB.Connection")
set adoRS = Server.CreateObject("ADODB.Recordset")
adoConn.Open " ....."
adoRS.ActiveConnection = adoConn
if adoConn.errors.count = 0 then
adoRS.CursorLocation = 3
adoRS.CursorType = 1
adoRS.LockType = 3
adoRS.Source = "SELECT * FROM " & currsec &
" WHERE id=" & query
adoRS.Open
if adoRS.EOF then
Response.Redirect("error.asp")
adoRS.Close
adoConn.Close
else
filename = adoRS("filename")
link
= Server.MapPath(category & "/" section)
link = link & "/" & filename
title = adoRS("sitename")
clicks = CInt(adoRS("clicks"))
adoRS("clicks") = clicks + 1
adoRS.UpDate
adoRS.Close
adoConn.Close
Response.Redirect(link)
end if
end if
%>
<html>
<head>
<title>Redirecting.. <% =title%></title>
</head>
<body>
</body>
</html>
Non c'è molto di nuovo mi sembra.
|
| |
|
| |
|
|
|
|
Accesso ai Files |
Il linguaggio ASP, come già accennato, permette tramite
un oggetto FileSystemObject di accedere alla lettura/scrittura
di files sul server e ad una serie di funzioni (e proprietà)
già implementate.
Innanzitutto, come al solito, si definisce un nuovo oggetto:
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Quindi ora è possibile usare l'oggetto objFSO per il proprio
codice. Supponiamo di avere nella variabile filepath il persorco
completo compreso il nome del file a cui vogliamo accedere:
filepath = server.mappath("resources/ReadMe.txt")
Quasi sempre è utile controllare se il file esiste per evitare
errori in runtime:
if objFSO.FileExists( filepath ) then...
un controllo alternativo è:
if objFile.Size>0 then ..
Ora con il metodo OpenTextFile dell'oggetto FileSystemObject
creaiamo un oggetto che ci permette di accedere al file:
Set objFile = objFSO.OpenTextFile(filepath, 1,
False)
I parametri corrispondono rispettivamente a: percorso del file,
metodo di accesso al file, opzione che crea il file se non esiste.
Ricordo che per controllare se vi sono errori in runtime basta vericifare
la variabile di sistema Err, ovviamente si deve
aver dichiarato all'inizio la chiave "On Error Resume Next",
altrimenti il codice restituirà un errore.
Ora leggiamo il file e lo scriviamo nella pagina ASP:
do while objFile.AtEndOfStream = false
tmpline=objFile.ReadLine
Response.Write(tmpline & "<br>")
loop
Quindi chiudiamo i due oggetti:
objFile.Close
objFSO.Close
Se volessimo scrivere nel file invece:
..
Set objFile = objFSO.OpenTextFile(filepath, 8, True)
objFile.WriteLine("Hello eWorld!")
objFile.Close
..
|
| |
|
| |
|
|
|
|
Esempio:
Ricerca di una parola in files di testo pseudo-ricorsiva |
Questa funzione da trattare come esempio
ricerca una stringa in ogni file di tutte le directory e tutte le
sotto-directory.
Il fulcro della funzione di ricerca è il metodo Instr(stringa1,
stringa2) che restituisce la
posizione del primo carattere della stringa2 trovato nella stringa1,
0 significa che la stringa non è stata trovata.
Function filesearch()
dim FSO, Dir, SubDir, objFile, objThisFile, Content,
searchroot, keypos, abstractlen
abstractlen = 250
searchroot = Server.MapPath(".")
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set Dir = FSO.GetFolder(searchroot)
For Each SubDir in Dir.SubFolders
For Each objFile in SubDir.Files
Set objThisFile = FSO.OpenTextFile(objFile.Path,
1, False)
if objFile.Size>0 then
Content = LCase( objThisFile.ReadAll()
)
keypos = Instr(Content, keywords)
If keypos<>0 then
Response.Write( "<a href="""
& objFile.Path & """ title="""
& objFile.Size & " bytes, Last update:
" & objFile.DateLastModified & """
target=""_blank"">" &
objFile.Name & "</a><br>")
end if
end if
objThisFile.Close
Set objThisFile = Nothing
Next
Next
Set SubDir = Nothing
Set FSO = Nothing
End Function
|
| |
|
| |
|
|
|
|
| Informazioni sul Visitatore |
L'oggetto Request come gia visto in
generale permette di ottenere informazioni, tramite in metodo ServerVariables(nome_var)
possiamo leggere parecchie informazioni sul visitatore, sul server
e sulla connessione corrente.
L'approccio che trovo più diretto e veloce è di vedere
la lista di tutte le variabili disponibili e il loro valore corrispondente,
il costrutto
For Each Thing in Request.ServerVariables
..
Next
implementa da solo cio che vogliamo ottenere.
Seguente il codice HTML e ASP completo (eseguibile
online):
<table width="95%" border="0"
align="center" cellpadding="0" cellspacing="0"
class="txtlight">
<tr bgcolor="#DDDDDD">
<td width="30%" nowrap class="txt">Server
Side Data</td>
<td width="70%" nowrap class="txt">Value</td>
</tr>
<tr>
<td width="30%"> </td>
<td width="70%" align="right" class="comment">[Request.ServerVariables]</td>
</tr>
<tr>
<%
Dim thing
For Each thing in Request.ServerVariables
Response.Write("<tr onMouseOver=""this.style.background='#FFFFFF';""
onMouseOut=""this.style.background='#EEEEEE';"">")
Response.Write("<td width=""30%""
nowrap>" & thing & "</td>")
Response.Write("<td width=""70%"">"&
Request.ServerVariables(thing) &"</td>")
Response.Write("</tr>")
Next
%>
</tr>
</table>
Il codice è estremamente semplice. |
| |
|
| |
|
| |
|
|