eWorld Network ReSearch
Last update: 25/10/2003
by Alessandro Polo
ASP & MYSQL (ADO) Tutorial
   
   
   
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&parametro2=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%">&nbsp;</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.

   
   
   
 

All trademarks are property of their respective owners.
Any tools listed and available in zip package is free and was downloaded from the Internet.
You are authorized to copy, redistribute and print this paper, keeping Author's credits visible and without changing the document's content.
Author is not responsible for any consequences or damages related in any way to this material.

Last update: 25/10/2003

     
     
     
     
ReSearch Home open source 2003 | by Alessandro Polo eWorld Network