|

SISTEMA DI ROTAZIONE BANNER

SELECT.ASP
Per
visualizzare il banner all'interno di una pagina, abbiamo
visto che è sufficiente inserire un javascript
che mi richiami il file select.asp.
Infatti questo è file incaricato di prelevare
dal database un banner e di visualizzarlo.
Prima di visualizzare il banner però dobbiamo
compiere alcune operazioni: innanzitutto vedere se il
banner cercato è un banner fisso o a rotazione.
Nel caso incui il banner sia fisso non abbiamo
grossi problemi: preleviamole informazioni su questo
banner nel database e le mostriamo a schermo.
Nel
caso invece di banner a rotazione dobbiamo innanzitutti
selezionare solo i banner che sono ancora attivi, ovvero
i banner in cui non sia ancora raggiunto il numero massimo
di impression, di click o la data di scadenza. Oltre
a questi sono visualizzabili i banner per cui non è
stato fissato alcun limite.
Nel caso in cui non ci sia alcun banner valido (o perché
tutti hanno raggiunto i limite fissati o la data di
scadenza) faremo in modo di visualizzare un banner di
default.
Una
volta trovati i banner occorre selezionarne uno a caso,
tenendo però presente il fattore importanza:
un banner con importanza doppia rispetto a dun altro
dovrà avere il doppio delle probabilità
di essere visualizzato.
A
questo punto possiamo visualizzare il banner e le informazioni
ad esso associate.
Vale
la pena far notare che la seconda riga del codice riportato
serve ad evitare che le informazioni visualizzate siano
memorizzate nella cache: infatti abbiamo posto come
scadenza il valore zero.
In questo modo, ogni volta che viene richiamata la pagina,
avremo un banner diverso.
In caso contrario la pagina select.asp verrebbe memorizzata
nella cache del browser con il risultato di visualizzare
sempre lo stesso banner.
Ora
creiamo la connessione al database banner.mdb
memorizzato nella cartella mdb-database e successivamente
dobbiamo
verificare se il banner da visualizzare è fisso
o a rotazione.
Se il banner è fisso la stringa javascript che
richiama questo file contiene il parametro like=fisso,
in caso contrario il parametro like ha rotazione
come valore.
Pertanto facciamo un request.querystring per
verificare il valore di tale parametro. Se tale parametro
coincide con rotazione il banner è a rotazione.
|
Dim
Conn
Set Conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver
(*.mdb)};dbq=" & server.mappath("mdb-database/banner.mdb")
come=request.querystring("like")
if come="rotazione" then
|
Come
si può vedere abbiamo utilizzato il metodo mappath
in quanto non richiede alcun intervento da parte del
provider (al contrario dei DSN di sistema).
Secondo alcuni inoltre tale metodo sarebbe più
performante della stessa connessione con DSN (al contrario
di quanto afferma la stessa Microsoft).
Creata
la connessione definiamo il recordset che conterrà
le informazioni prelevate dal database.
|
Dim
rs
set rs=Server.CreateObject("adodb.recordset")
|
Fatto
questo prepariamo la stringa di ricerca che dovrà
selezionare tutti campi (select *) dalla tabella
banner (from banner) dove (where) il numero
di impression registrate (totHits) sia minore
del limite fissato (maxHits) e dove il numero
di click ricevuti dal banner stesso (totClick)
sia minore del numero massimo di click impostato (maxHits).
Inoltre, dato che i banner senza un limite di impression
o di clic hanno questi campi contrassegnati dal numero
zero, chiediamo di selezionare anche i banner i cui
campi maxHits e maxliClick contengano
il numero zero (or maxHits=0... or maxClick=0).
Inoltre dobbiamo evitare di caricare il banner associato
all'utente default: infatti questo banner viene
visualizzato solo quando non ci sono altri banner disponibili.
Ultima condizione è che non si sia ancora raggiunta
la data di scadenza. Per verificare questo utilizziamo
la funzione
dateDiff(criterio,
data1, data2)
dove
per criterio utilizzo i giorni (quindi 'd'),
data1 è la data odierna che si ottiene grazie a date()
e data2 è invece il secondo termine di confronto ovvero
il valore prelevato dal campo enddata del database;
campo in cui inseriamo la data di scadenza del banner
stesso, raggiunta la quale il banner non dovrà essere
più visualizzato. Quando data2 è posteriore a data1
(quindil la data di scadenza è nel futuro) si
ha un risultato positivo. In tutti gli altri casi (anche
nel caso di uguaglianza) si ha un risultato negativo.
Quindi se endData (la data di scadenza) è non è ancora
passata, avrò un numero positivo (> 0) e il banner può
essere visualizzato.
|
SQL="SELECT
* FROM banner where utente <> 'default'
and ((tothits < maxhits or maxhits=0) and (totClick
< maxClick or maxclick=0)) and Datediff('d',"&
Date() &", endData)>0"
|
Come
già abbiamo anticipato, noi vogliamo fare in
modo che sia possibile fissare dei limiti al numero
di impression, di click e una data di scadenza.
Tali limiti sono però facoltativi, non certo
obbligatori. Quindi posso decidere di non impostare
nessun limite.
Per la data non abbiamo problemi: fissiamo una data
estremamente lontana (per esempio 01/01/3000) e questo
è sufficiente a garantirci la corretta funzionalità
del sistema.
Per quanto riguarda il numero di click e di impression,
fissare un limite, seppur molto alto, può non
essere una soluzione ottimale, in quanto esiste la possibilità
(seppur remota) di raggiungerlo.
Quindi quando non vogliamo fissare un limite alle impression
o ai click, il campo maxHits e maxClick del database,
conterranno il numero zero.
In questo modo la disuguaglianza totHits < maxHits
(o totClick < maxClick) non è verificata.
Aquesto limite sopperisce l'istruzione seguente: or
maxHits=0
In questo modo vengono selezionati i banner che
hanno il numero di impression inferiore al limite oppure
i banner con il limite impostato a zero.
Ora
eseguiamo la query nel nostro database, impostando il
tipo di cursore e il blocco del database (cursore statico
e blocco ottimistico)
Controlliamo
quindi che l'interrogazione del database abbia dato
almento un risultato: se così non fosse significa
che non ci sarebbero banner visualizzabili e di conseguenza
deve essere visualizzato il banner di default.
Per conoscere il numero di risultati dell'interrogazione
utilizziamo rs.recordcount: se questo numero
è uguale a zero dovrò eseguire il codice
relativo alla visualizzazione del banner di default.
|
if
rs.recordcount="0" then
|
Quindi
preparo il recordset
|
set
rs=Server.CreateObject("adodb.recordset")
|
e
seleziono i campi relativi all'utente default.
|
SQL="SELECT
* FROM banner where utente='default'"
rs.open SQL, Conn, 3,3
%>
|
Fatto
questo possiamo mostrare il banner.
Dato che ilfile select.asp viene richiamato da una riga
di codice javascript, il banner e le relative informazioni
dovranno essere visualizzate in un modo compatibile
con questo linguaggio ovvero dovrà essere visualizzato
qualcosa del tipo document.write("risultato dell'elaborazione")
Per far ciò utilizziamo il consueto response.write,
prelevando i valore che ci necessitano dal recordset
stesso (esempio rs("url")).
|
document.write("<a
href='<% response.write(rs("url"))%>'
target='<% response.write(rs("target"))%>'><img
border='0' src='<% response.write(rs("immagine"))
%>' alt='<% response.write (replace(rs("alt"),"'","'"))
%>'></a>")
|
Sicuramente avete notato che per quanto riguarda l'etichetta
di testo del banner abbiamo scritto
response.write (replace(rs("alt"),"'","'"))
ovvero chiediamo di sostituire tutti gli apici (ovvero
gli apostrofi) contenuti nel testo da associare al banner,
con '
Infatti tutti i caratteri possono essere scritti come
nella modalità nn; dove nn
é il valore ASCII a 7 bit del carattere stesso.
Nel nostro caso l'apostrofo ha valore 39, quindi scriveremo
'
Per l'utente non cambia nulla: infatti sia che si scriva
direttamente l'apostrofo sia che si scriva il suo valore
in ascii, il risultato è lo stesso.
Perché
tutto questo?
Il motivo è semplice: se nell'etichetta di testo
abbiamo uno o più apici, l'etichetta stessa verrebbe
troncata al primo di questi.
Infatti il codice html generato ha una forma del tipo
<img
border='0' src='.....'><alt='......'>
Come
si vede anziché le virgolette doppie utilizzate
normalmente nell'html qui si usano le virgolette singole
(ovvero apici o apostrofi), in quanto le virgolette
doppie sono utilizzate all'inizio da parte del javascript
stesso (document.write(".....")).
Pertanto se noi avessimo un'etichetta di testo del tipo
L'avventura comincia il codice html generato
sarebbe
<img
border='0' src='.....'><alt='L'avventura comincia'>
Dato
che il browser visualizza solo il testo compreso fra
due apici, nel nostro caso verrebbe visualizzata solo
la lettere L e nient'altro, in quanto le parole
avventura comincia sono al di fuori del secondo
apice.
Per risolvere questo problema usiamo il trucco di sostituire
l'apice con '
In questo modo il browser non trova più l'apice
che interrompe l'etichetta di testo e quindi viene visualizzata
la frase intera.
Dato che per il banner di default non teniamo traccia
né delle impression né dei click (teoricamente questo
banner non dovrebbe mai essere visualizzato, in quanto
si presume che nel circuito ci sia almeno un banner
valido!), una volta mostrato a video, svuotiamo il recordset
e chiudiamo la connessione, in modo da liberare memoria
sul server. Inoltre aggiungiamo il comando 'response.end'
che impedisce l'esecuzione del codice che segue (senza
dimenticare l'end if che chiude l'if... then...
iniziato prima)
|
<%
rs.close
set rs=nothing
conn.close
set conn=nothing
response.end
end if
|
|