Verificare l'esistenza di una unità disco Per verificare se una specifica unità disco è presente sul server è possibilie sfruttare il metodo DriveExists dell'oggetto FileSystemObject. Il parametro di questo metodo è di tipo stringa e contiene la lettera dell'unità drive. Se il drive esiste, il metodo FileExists restituisce True, in caso contrario restituisce False. In questo script di esempio, verifichiamo la presenza dell'unità disco "D:" : <% Dim objFile Set objFile = Server.CreateObject ("Scripting.FileSystemObject") If objFile.DriveExists ("D:") Then Response.Write "Il drive specificato è presente sul server." Else Response.Write "Il drive specificato NON è presente sul server." End If Set objFile = Nothing %> Creare una directory sul server Creare una nuova directory sul server tramite uno script ASP è piuttosto rapido, e richiede l'utilizzo dell'oggetto FileSystemObject. Da sottolineare che la directory dovrà essere creata in una cartella in cui si hanno i permessi in scrittura; in caso contrario il processo fallirà, e verrà segnalato un messaggio d'errore. Ecco il listato da utilizzare: <% Dim newdir newdir = "/public/newfolder" Dim objFile Set objFile = Server.CreateObject("Scripting.FileSystemObject") objFile.CreateFolder Server.MapPath(newdir) Response.Write "Directory creata" %> In questo caso viene creata la sottodirectory newfolder all'interno della directory public (già esistente). Conversioni fra tipi di dato Il tipo di variabile più usata in Vbscript è il variant. Ecco le varie funzioni per convertire i tipi presenti in Vbs: <% 'Conversione in Boolean Dim A,B,Controllo Controllo= CBool(A=B) 'Conversione in Byte Dim Num,NumByte Num= 125.5678 NumByte = CByte(Num) 'Conversione in Date Data = "October 19, 1962" Data_Convertita = CDate(Data) Tempo= "4:35:47 PM" Tempo_Convertito = CDate(Tempo) 'Conversione in Double e Currency Dim Curr,Doub Curr = CCur(234.456784) Doub = CDbl(Curr * 8.2 * 0.01) 'Conterrà (19.2254576) 'Conversione in Int Dim Intero Doub = 2345.5678 Intero = CInt(Doub) 'Conterrà (2346) 'Conversione in Long Dim Val1, Val2, Long1, Long2 Val1 = 25427.45 Val2 = 25427.55 Long1 = CLng(Val1) 'Conterrà (25427) Long2 = CLng(Val2) 'Conterrà (25428) 'Conversione in Single Dim Doub1, Doub2, Single1, Single2 Doub1 = 75.3421115 Doub2 = 75.3421555 Single1 = CSng(Doub1) 'Conterrà (75.34211) Single2 = CSng(Doub2) 'Conterrà (75.34216) 'Conversione in String Doub = 437.324 Stringa = CStr(Doub) 'Conterrà ("437.324") %> Scambiare il contenuto di due variabili I programmatori "storici" del Basic (come il sottoscritto) ricorderanno sicuramente come il GWBASIC mettesse a disposizione la funzione [Swap var1, var2] per scambiare il contenuto di due variabili ("swap" significa scambio). Questa comodissima funzione scomparve poi misteriosamente con l'introduzione del Visual Basic (fu letteralmente "dimenticata" dalla Microsoft). Naturalmente questa "mancanza" è stata tramandata fino al VBScript, con cui solitamente sviluppiamo le nostre pagine ASP. Quindi dobbiamo crearci una funzione ad hoc (più corretto sarebbe dire "procedura"). Ecco la versione "classica", che fa uso di una variabile temporanea (altresì detta variabile d'appoggio): <% Sub Swap(a, b) Dim temp temp = a a=b b = temp End Sub %> La versione seguente permette di eliminare la variabile d'appoggio, ma può usarsi soltanto con variabili di tipo numerico (sia di tipo intero che a virgola mobile): <% Sub Swap1(a, b) a=a+b b=a-b a=a-b End Sub %> L'ultima versione che vi presento è quella che io considero più "elegante" ed è specificatamente ottimizzata per variabili di tipo numerico intero: <% Sub Swap2(a, b) a = a Xor b b = b Xor a a = a Xor b End Sub %> Interessante ed educativa sarebbe una spiegazione di come la Swap2, tramite l'operatore logico XOR, effettui lo scambio. Ma questo andrebbe oltre lo scopo di questo articolo. Settare le impostazioni internazionali In ASP è possibile settare le impostazioni internazionali, che tra l'altro riguardano anche il formato di valuta e data, tramite la proprietà LCID dell'oggetto Session. Ecco un esempio in cui questa proprietà viene settata in modo che vengano utilizzate le impostazioni italiane standard: <% Session.LCID = 1040 %> Ecco la tabella con tutti i valori corrispondenti: Locale Description Afrikaans Albanian Arabic U.A.E. Arabic Bahrain Arabic Algeria Arabic Egypt Arabic - Iraq Arabic Jordan Arabic Kuwait Arabic Lebanon Arabic Libya Arabic Morocco Arabic Oman Arabic Qatar Arabic Saudi Arabia Arabic - Short String af sq Hex Value 0x0436 0x041C ar-ae Decimal Value 1078 1052 Locale Description Hindi Hungarian Short String hi hu Hex Value 0x0439 0x040E Decimal Value 1081 1038 0x3801 14337 Icelandic is 0x040F 1039 ar-bh 0x3C01 15361 Indonesian in 0x0421 1057 ar-dz 0x1401 5121 it 0x0410 1040 ar-eg 0x0C01 3073 it-ch 0x0810 2064 ar-iq 0x0801 2049 Italian Standard Italian Switzerland Japanese ja 0x0411 1041 ar-jo 0x2C01 11265 Korean ko 0x0412 1042 ar-kw 0x3401 13313 Latvian lv 0x0426 1062 ar-lb 0x3001 12289 Lithuanian lt 0x0427 1063 ar-ly 0x1001 4097 Macedonian mk 0x042F 1071 ar-ma 0x1801 6145 Malay Malaysia ms 0x043E 1086 ar-om 0x2001 8193 Maltese mt 0x043A 1082 ar-qa 0x4001 16385 Norwegian no Bokmål 0x0414 1044 ar-sa 0x0401 1025 Polish pl 0x0415 1045 ar-sy 0x2801 10241 Portuguese - pt 0x0816 2070 Syria Arabic Tunisia Arabic Yemen Basque ar-tn 0x1C01 7169 ar-ye 0x2401 9217 eu 0x042D 1069 Belarusian be 0x0423 1059 Bulgarian bg 0x0402 1026 Catalan ca 0x0403 1027 zh-cn 0x0804 2052 zh-hk 0x0C04 3076 zh-sg Chinese PRC Chinese Hong Kong S.A.R. Chinese Singapore Chinese Taiwan Croatian Standard Portuguese Brazil RaetoRomance Romanian Romanian Moldova Russian Russian Moldova Serbian Cyrillic pt-br 0x0416 1046 rm 0x0417 1047 ro 0x0418 1048 ro-mo 0x0818 2072 ru 0x0419 1049 ru-mo 0x0819 2073 sr 0x0C1A 3098 Setsuana tn 0x0432 1074 0x1004 4100 Slovenian sl 0x0424 1060 zh-tw 0x0404 1028 Slovak sk 0x041B 1051 hr 0x041A 1050 sb 0x042E 1070 Czech cs 0x0405 1029 es 0x040A 1034 Danish da 0x0406 1030 es-ar 0x2C0A 11274 Dutch nl 0x0413 1043 es-bo 0x400A 16394 nl-be 0x0813 2067 Sorbian Spanish Standard Spanish Argentina Spanish Bolivia Spanish Chile Spanish Columbia Spanish Costa Rica Spanish Dominican Republic Spanish Ecuador Spanish Guatemala es-cl 0x340A 13322 es-co 0x240A 9226 es-cr 0x140A 5130 es-do 0x1C0A 7178 es-ec 0x300A 12298 es-gt 0x100A 4106 es-hn 0x480A 18442 Dutch Belgium English Australia English Belize English Canada English Ireland English Jamaica English New Zealand English South Africa English Trinidad English United Kingdom English United States en-au 0x0C09 3081 en-bz 0x2809 10249 en-ca 0x1009 4105 en-ie 0x1809 6153 en-jm 0x2009 8201 en-nz 0x1409 5129 en-za 0x1C09 7177 en-tt 0x2C09 11273 Spanish Honduras Spanish Mexico Spanish Nicaragua es-mx 0x080A 2058 es-ni 0x4C0A 19466 en-gb 0x0809 2057 Spanish Panama es-pa 0x180A 6154 en-us 0x0409 1033 Spanish Peru es-pe 0x280A 10250 Estonian et 0x0425 1061 es-pr 0x500A 20490 Farsi fa 0x0429 1065 es-py 0x3C0A 15370 Spanish Puerto Rico Spanish - Paraguay Spanish - El es-sv Salvador Spanish es-uy Uruguay Spanish es-ve Venezuela Finnish fi 0x040B 1035 Faeroese fo 0x0438 1080 fr 0x040C 1036 fr-be 0x080C 2060 Sutu sx 0x0430 1072 fr-ca 0x0C0C 3084 Swedish sv 0x041D 1053 fr-lu 0x140C 5132 Swedish Finland sv-fi 0x081D 2077 fr-ch 0x100C 4108 Thai th 0x041E 1054 gd 0x043C 1084 Turkish tr 0x041F 1055 de 0x0407 1031 Tsonga ts 0x0431 1073 de-at 0x0C07 3079 Ukranian uk 0x0422 1058 de-li 0x1407 5127 Urdu Pakistan ur 0x0420 1056 de-lu 0x1007 4103 Vietnamese vi 0x042A 1066 de-ch 0x0807 2055 Xhosa xh 0x0434 1076 el he 0x0408 1032 0x040D 1037 Yiddish Zulu ji zu 0x043D 1085 0x0435 1077 French Standard French Belgium French Canada French Luxembour g French Switzerland Gaelic Scotland German Standard German Austrian German Lichtenstein German Luxembour g German Switzerland Greek Hebrew 0x440A 17418 0x380A 14346 0x200A 8202 Timeout di una pagina ASP Per impostare la durata massima di esecuzione di una pagina asp si puo modificare la proprietà ScriptTimeout dell'oggetto Server; il suo valore di default è di 90 secondi. Nell'esempio seguente, tale proprietà viene impostata a 2 minuti; in questo caso, quando una pagina non viene eseguita entro 120 secondi, va in timeout. <% Server.ScriptTimeout = 120 %> E' bene prestare attenzione al valore di timeout che si imposta, in quanto pagine contenenti elaborazioni piuttosto pesanti possono necessitare di un tempo relativamente alto per essere eseguite. Dimensione di un Array La funzione UBound di VBScript restituisce l'indice piu elevato per la dimensione dell'array che viene indicata. Viene utilizzata per conoscere la dimensione di un array. La sintassi è la seguente: UBound (array, dimensione) array è il nome dell'array, dimensione indica la dimensione di cui si vuole conoscere l'indice massimo: 1 è la prima dimensione, 2 la seconda, e cosi via... Ecco un esempio che ne illustra il funzionamento: <% Dim myArray(6, 2, 9, 3) 'array a 4 dimensioni UBound(myArray, 1) 'restituisce 6 UBound(myArray, 3) 'restituisce 9 %> Gestione degli Errori Il seguente script mostra come è possibile visualizzare il numero e il tipo di errore che eventualmente si verifica nell'esecuzione di una pagina ASP. Innanzitutto si inizializza la gestione degli errori con la riga: On Error Resume Next. A questo punto, si cerca la porzione di codice in cui si presume si trovi l'errore e si visualizzano le proprietà Number e Description dell'oggetto Err. Nell'esempio di questo script viene provocato un errore in quanto si cerca di effettuare una divisione per 0: <% On Error Resume Next Response.Write (6/0) Response.Write ("Errore "&Err.Number&" - "&Err.Description) %> Eseguendo questo script dovreste ottenere il seguente ouput: Errore 11 - Divisione per zero Visualizzare la collezione ServerVariables La collezione ServerVariables dell'oggetto Request contiene importanti ed utili informazioni riguardanti il server e il client che sta navigando sul server stesso. Con queste poche righe di codice è possibile visualizzare sul browser la lista completa di queste variabili e il loro valore al momento dell'esecuzione dello script: <% dim item for each item in Request.ServerVariables Response.Write(item & "= "&Request.ServerVariables(item) & "<br>") next %> Convertitore Lire/Euro Sempre più spesso abbiamo la necessità di convertire un valore in lire in Euro, ecco una funzione che ci permette di ottenere questa conversione: <% Function LireInEuro(ByVal lire) Const Euro = 1936.27 Dim e e = FormatCurrency((lire/Euro), 2) LireInEuro = e 'restituisce il valore in euro End Function %> La funzione riceve il valore in lire e restituisce il corrispondente in euro lasciando due decimali dopo la virgola; da ricordare che se il valore da convertire è preso da un form questo deve prima essere convertito in un intero (in VBScript ciò può essere fatto tramite la funzione CInt). Inviare e-mail con allegati Il seguente script illustra come è possibile allegare un file ad una email inviata tramite CDONTS; in questo esempio alleghiamo il file chiamato prova.txt, che supponiamo si trovi nella root principale del nostro sito. <% Set myMail = Server.CreateObject("CDONTS.NewMail") 'specifichiamo il nome del file da allegare myMail.AttachFile(Server.MapPath("\prova.txt")) 'inviamo l'e-mail myMail.Send "[email protected]", "[email protected]", "Mail con Allegato", "Prova di invio e-mail con allegato", 1 Set myMail = nothing %> Come gestire il ritorno a capo Quando usiamo un input di tipo text multilinea ci può interessare riconoscere quando l'utente inserisce dei ritorno a capo e sostituirli con un <br> per poi stampare il contenuto dell'input in una pagina html. Ecco la soluzione in VBScript: <% Dim Testo Testo = Request.QueryString("miotesto") 'Riceviamo il testo Testo = Replace(Testo, VbCrLf, "<br>") 'Sostituiamo i ritorni a capo %> VbCrLf è una costante VBScript che indica appunto il carattere di fine riga e ritorno a capo. Visualizzare il contenuto di una directory Per stampare il contenuto di una directory ci serviamo dell''oggetto FileSystemObject; nella variabile nomedir andrà specificato il nome della directory scelta. Ecco il codice: <% Set fs = Server.CreateObject ( "Scripting.FileSystemObject" ) Set dir = fs.GetFolder( nomedir ) For Each File In dir.Files Response.Write( File.Name )&"<BR>" Next %> Sostituire gli apici nelle stringhe Quando si inseriscono stringhe in una database può capitare che queste contengano degli apici; questi apici possono provocare errori quando il nostro codice SQL viene eseguito. Ecco come risolvere il problema: <% Testo = Replace ( Testo, "'", "''" ) %> La variabile Testo conterrà il nostro testo da utilizzare e tramite la funzione Replace sostituiremo all'interno della stringa il carattere ' con un doppio apice('') in modo che la stringa SQL lo interpreti come un apice singolo. Attenzione: quando si parla di doppio apice non si intendono le virgolette (") ma bensì 2 volte il carattere apice ('). Ottenere l'IP del Visitatore Nel caso in cui si vogliano realizzare dei report e delle statistiche riguardanti le visite a un sito web, può essere molto utile conoscere l'indirizzo IP dell'utente che sta visitando il sito stesso. Tale informazione è contenuta nella collezione ServerVariables dell'oggetto Request; il nome della variabile in questione è REMOTE_ADDR. Vediamo il codice che permette di visualizzare sul browser il proprio indirizzo IP: <% Dim ip ip = Request.ServerVariables("REMOTE_ADDR") Response.write "Il tuo indirizzo IP è: " &ip %> Conoscere il percorso di un file sul server In certi casi può essere necessario sapere il percorso completo di un file che si trova nel server, questo è possibile tramite il metodo MapPath dell'oggetto Server: <% Dim Percorso Percorso = Server.MapPath("prova.txt") Response.Write ("Il percorso del file prova.txt è :"&Percorso) %> Questo breve script ricerca il file prova.txt e ne visualizza il percorso sulla pagina del browser. Collegarsi ad Access con Password Ecco come creare una connessione ADO ad un database Access in cui è stata impostata una password: <% Dim Conn Set Conn=Server.CreateObject("ADODB.Connection") Conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&_ server.MapPath("database.mdb")&";PWD=password" %> Al posto di password ovviamente andrà sostituita la password del database. Connessione ad un DataBase Access Quando si lavora con un database Access il primo passaggio da effettuare è la connessione con la sorgente di dati (il database stesso). Per realizzare la connessione si utilizza l'oggetto ADO Connection; dopo la connessione ad una fonte di dati tramite il metodo Open, l'oggetto agisce da interfaccia con la fonte di dati. Vediamo il codice necessario ad aprire la connessione con un database Access: <% Dim cn Set cn = Server.CreateObject("ADODB.Connection") cn.Open "driver={Microsoft Access Driver(*.mdb)};dbq="&_ Server.MapPath("databasename.mdb") %> dove databasename sarà il nome del database che vogliamo aprire. Generare Numeri Casuali A volte, in una pagina internet, si può avere la necessità di generare numeri casuali; per ottenere ciò è possibile utilizzare la funzione di VBScript Rnd(). Il semplice utilizzo di questa funzione non produce numeri "realmente casuali", in quanto genera sempre la stessa sequenza di numeri. Per ovviare a ciò, prima di utilizzare la funzione Rnd(), è necessario inizializzare il generatore di numeri casuali tramite l'istruzione Randomize(), che sfrutta il timer del sistema per generare una sequenza di numeri random. Vediamo quindi il codice che permette di visualizzare una serie di 10 numeri casuali: <% Randomize Dim i for i=0 to 9 Response.Write(Rnd()&"<br>") next %> Visualizzare la Data e l'Ora attuali Spesso capita di vedere in una pagina web, la data e l'ora attuale. Per poter visualizzare la data tramite uno script asp possiamo utilizzare la funzione di VBScript Date() che restituisce la data corrente del server nel determinato istante in cui la pagina viene inviata al browser; l'analoga funzione che restituisce l'orario è Time(). Se intendiamo visualizzare sia data che orario possiamo utilizzare la funzione Now() che equivale alla concatenazione dei risultati delle funzioni Date e Time. Ecco il codice di esempio: <% Response.Write ("Oggi è il: " &Date()) Response.Write ("<%br>%") Response.Write ("Sono le ore: " &Time()) %> Reindirizzare il Browser Per reindirizzare il browser ad una determinata pagina è possibile sfruttare il metodo Redirect dell'oggetto Response. Il reindirizzamento dovrà essere effettuato prima che venga inviata qualsiasi riga di HTML al browser dell'utente altrimenti si verificherà un errore. Vediamo ora lo script che consente il reindirizzamento: <% 'Reindirizziamo alla pagina prova.asp Response.Redirect("/prova.asp") %> Anche se può sembrare molto utile è meglio non abusare di questo metodo in quanto costringe il server a caricare due pagine; inoltre il metodo Redirect non è supportato da alcuni browser. Rinominare un file con FileSystemObject FileSystemObject è un oggetto utilizzato per fornire accesso al fyle sistem del computer. Una caratteristica di questo oggetto è la mancanza di un metodo diretto che consenta di rinominare i file. Per ovviare a tale "mancanza" è possibile sfruttare la proprietà MoveFile nel modo seguente: <% Dim fs Set fs = Server.CreateObject("Scripting.FileSystemObject") fs.MoveFile "c:\nomefile.asp", "c:\nomefile_rinominato.asp" Set fs = nothing %> Realizzare una Copia di backup di una tabella Può capitare a volte di voler effettuare una copia di backup di una determinata tabella del nostro database; per fare ciò è possibile utilizzare una stringa sql che inserisca tutti i valori della tabella che vogliamo "duplicare" in una nuova tabella. In questo modo otterremo una copia, sia della struttura che dei dati, della tabella di partenza. Ecco il codice dello script: <% 'Creiamo la connessione al database Dim cn Set cn = Server.CreateObject("ADODB.Connection") cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" &_ Server.MapPath("mio_database.mdb") 'Componiamo la stringa SQL e la eseguiamo Dim sql sql = "INSERT INTO Tabella_Copia SELECT * FROM Tabella_Source" cn.Execute(sql) Set cn = nothing %> Rilevare l'URL della pagina di provenienza Per rilevare l'indirizzo della pagina da cui proviene un utente è possibile sfruttare la variabile d'ambiente HTTP_REFERER della collezione ServerVariables dell'oggetto Request. Vediamo un esempio di codice: <% Dim fromURL fromURL = Request.ServerVariables("HTTP_REFERER") Response.Write "La pagina di provenienza è: " &fromURL& "." %> Ottenere l'URL completo della pagina attuale Spesso si ha la necessità di conoscere l'indirizzo completo della pagina che sta eseguendo il nostro script ASP; per fare ciò è possibile sfruttare e concatenare fra loro alcuni elementi della collezzione Server Variables. Vediamo il codice ASP necessario: <% Dim sito sito = Request.ServerVariables("HTTP_HOST") Dim pagina pagina = Request.ServerVariables("SCRIPT_NAME") Dim querystring querystring = Request.QueryString Dim url url = "http://" & sito url = url & pagina if len(querystring) > 0 then url = url & "?" & querystring end if Response.write "L'indirizzo completo di questa pagina è: " &url & "." %>