Creazione di un Guestbook in Asp

Siti dinamici con ASP
Impara a creare siti dinamici professionali con ASP

Scritto da Luca Ruggiero nella sezione Asp

Introduzione

Un guestbook, detto anche libro degli ospiti, è un sistema che molti siti utilizzano per permettere ai propri utenti di lasciare un messaggio o un commento.
Si tratta di un servizio molto grazioso e di semplice realizzazione, si dispone di un modulo da compilare per inserire una serie di dati richiesti, di una pagina in cui i messaggi vengono mostrati in ordine cronologico inverso (dal più recente fino al primo), e di un file che, lavorando in back-office, effettua in primis un controllo sulla validità dei dati richiesti nel modulo, poi, a condizioni soddisfatte, effettua l'inserimento del messaggio.

Cosa ci serve per realizzare il guestbook

Come già detto ci serviremo di soli tre file per realizzare il guestbook, il file index.asp conterrà il modulo per l'invio del messaggio e stamperà a video i messaggi ordinati come detto in precedenza; il file inserisci.asp effettuerà già detti controlli e la registrazione del messaggio; in fine, il file guestbook.mdb è il database che utilizzeremo per conservare stabilmente i messaggi sul server Web.

Nota: Possiamo utilizzare due file diversi per presentare il modulo e per visualizzare i messaggi, ma per un discorso pratico si è scelto di inglobare in un unico file i due servizi. Inoltre, la demo risultante da questo articolo è stata corredata di un nuovo servizio rispetto alla versione precedente, ovvero la possibilità di leggere soli 10 messaggi per pagina, grazie alla tecnica della paginazione.

Struttura del database

Si è scelto, per praticità e compatibilità con Asp, di utilizzare Ms Access (preferibilmente edizione 2000) come DBMS per questa applicazione, avviamo quindi la nostra copia di detto software e creiamo il file guestbook.mdb all'interno della cartella guestbook sul nostro server Web personale, creiamo una Nuova tabella in visualizzazione struttura e configuriamola con i seguenti campi:

id - tipo dato: contatore | selezioniamolo ed assegniamogli la chiave primaria
data - tipo dato: testo | non utilizziamo il campo data/ora, per la cronologia utilizzeremo il campo id.
nickname - tipo dato: testo
email - tipo dato: testo | in corrispondenza della voce Consenti lunghezza zero selezioniamo Si
homepage - tipo dato: testo | in corrispondenza della voce Consenti lunghezza zero selezioniamo Si
oggetto - tipo dato: testo
citta - tipo dato: testo
messaggio - tipo dato: memo | per consentire l'inserimento di testi lunghi.

Salviamo la tabella col nome messaggi e chiudiamo Access, il database è pronto.

Inserimento e lettura dei messaggi

Come opportunamente segnalato nella nota del secondo paragrafo di questo articolo, utilizzeremo un solo file, index.asp, per un triplice scopo: offrire il modulo per inserire il messaggio, stampare a video i messaggi dal più recente fino al primo, impaginare solo 10 messaggi alla volta, splittando in più pagine i messaggi residui, sempre solo 10 per volta.
Di seguito espongo il codice opportunamente commentato, in seguito focalizzeremo l'attenzione sui punti cruciali:

Nota: La stilizzazione utilizzata non verrà commentata, l'aspetto estetico del guestbook può essere personalizzato a seconda dei guisti del lettore.

<%@LANGUAGE = JScript%>
<%
   // Apro la connessione verso il database
   var Cn = new ActiveXObject("ADODB.Connection");
   var Sc = "driver={Microsoft Access Driver (*.mdb)};dbq=" + Server.MapPath("guestbook.mdb");
       Cn.Open(Sc);
   // Recupero i dati dalla tabella via Sql
   var Sql = "SELECT * FROM messaggi ORDER BY id DESC";
   // Utilizzo l'oggetto recordset per generare la paginazione
   var Mostra = new ActiveXObject("ADODB.Recordset");
       Mostra.Open(Sql,Cn,1);
   // Setto una variabile di tipo QueryString per muovermi nella stessa pagina
   // e mostrare a video messaggi diversi
   var pag = parseInt(Request.QueryString("id"));
       // Mi assicuro che il valore passato nella QueryString sia numerico
       if (isNaN(pag) || pag < 1) pag = 1;
       // Finchè non finisce il file continuo il conteggio ed imposto
       // a 10 il numero di record che voglio vengano estratti
       if (!Mostra.EOF) {
            Mostra.PageSize = 10;
            Mostra.AbsolutePage = pag;
       }
   // A questo scopo mi serve un contatore che imposto a zero (0) ed incrementerò in seguito
   var i = 0;
%>
<html>
 <head>
  <title>lukeonweb.net Guestbook - www.lukeonweb.net</title>
  <style type="text/css">
   td, div { font-size: 12px; font-family: Verdana; }
   a { color: #FFFFFF; text-decoration: None; }
   a:hover { color: #FFFFFF; text-decoration: None; }
   a.x { color: #3366CC; text-decoration: None; }
   a:hover.x { color: #FF0000; text-decoration: Underline; }
  </style>
 </head>
<body text="#192939">

<div align="center"><b>Firma il mio Guestbook</b></div>

<br>

<div align="center" style="color: #FF0000;">I campi contrassegnati da <b>*</b> sono obbligatori</div>

<br>

<!-- Creo il modulo per l'inserimento dei messaggi -->

<table align="center" cellpadding="1" cellspacing="0">
 <form method="post" action="inserisci.asp">
  <tr>
    <td><b>Nickname *</b></td>
    <td align="right"><input type="text" name="nickname"></td>
  </tr>
  <tr>
    <td><b>Email</b></td>
    <td align="right"><input type="text" name="email"></td>
  </tr>
  <tr>
    <td><b>Homepage</b></td>
    <td align="right"><input type="text" name="homepage"></td>
  </tr>
  <tr>
    <td><b>Città *</b></td>
    <td align="right"><input type="text" name="citta"></td>
  </tr>
  <tr>
    <td><b>Oggetto *</b></td>
    <td align="right"><input type="text" name="oggetto"></td>
  </tr>
  <tr>
    <td colspan="2"><b>Messaggio *</b></td>
  </tr>
  <tr>
    <td colspan="2"><textarea name="messaggio" rows="5" cols="30"></textarea></td>
  </tr>
  <tr>
    <td colspan="2" align="right">
       <input type="submit" value="  Firma  ">
       <input type="reset" value="Cancella">
    </td>
  </tr>
 </form>
</table>

<br>

<!--
   Creo il ciclo che eseguirà due controlli, la verifica che i record vengano letti tutti
   e che non ne vengano mostrati più di 10 per volta
-->
<%while((!Mostra.EOF) && (i<10)){%>
<table align="center" width="700" cellpadding="1" cellspacing="0" style="border: Solid 1px #192939;">
 <tr bgcolor="#192939">
   <td width="500" style="color: #FFFFFF;">
    <!-- Stampo a video il nickname del firmatario e la città -->
    <b>Messaggio di <%=Mostra("nickname")%> (da <%=Mostra("citta")%>)</b>
   </td>
   <td width="200" align="right">
    <!-- Controllo che l'email sia stata inserita, in caso negativo stampo a video uno spazio vuoto, -->
    <!-- altrimenti eseguo un link di tipo mailto: verso l'indirizzo segnalato -->
    <%if((Mostra("email") == "") || (Mostra("email") == "undefined")){%>
       &nbsp;
    <%}%>
    <%else {%>
       <a href="mailto:<%=Mostra("email")%>">[email]</a>
    <%}%>
    <!-- Lo stesso discorso vale per l'eventuale URL segnalata dal firmatario come propria Homepage -->
    <%if((Mostra("homepage") == "") || (Mostra("homepage") == "undefined")){%>
       &nbsp;
    <%}%>
    <%else {%>
       <a href="<%=Mostra("homepage")%>" target="_blank">[homepage]</a>
    <%}%>
   </td>
 </tr>
 <tr>
   <td colspan="2">
         <!-- Stampo a video l'oggetto, il messaggio e la data -->
         <b><%=Mostra("oggetto")%></b><br><br>
         <%=Mostra("messaggio")%><br><br>
         <div align="right" style="font-size: 10px;">
               Pubblicato in data <%=Mostra("data")%>
         </div>
   </td>
 </tr>
</table>

<br>

<!-- Incremento il contatore e mi muovo verso il primo record -->
<%
         i++;
      Mostra.MoveNext();
   }
%>

<!-- Stampo a video i link verso i precedenti ed i successivi 10 messaggi, i quali si attiveranno -->
<!-- solo nel caso in cui effettivamente, scorrendo i record, ne vengano trovati altri -->
<table align="center" width="700" cellpadding="0" cellspacing="0">
 <tr>
   <td width="50%">
      <%if (pag > 1) {%>&#171; <a href="index.asp?id=<%=pag - 1%>" class="x">Precedenti</a><%}%>
      <%else {%><font color="#778899">&#171; Precedenti</font><%}%>
   </td>
   <td width="50%" align="right">
      <%if (!Mostra.EOF) {%><a href="index.asp?id=<%=pag + 1%>" class="x">Successivi</a> &#187;<%}%>
      <%else {%><font color="#778899">Successivi &#187;</font><%}%>
   </td>
 </tr>
</table>

<!-- Chiudo la connessione -->

</body>
</html>
<%Cn.Close()%>
Beh, rileggendo i commenti al codice appena proposto forse ulteriori osservazioni sono superflue, si dà infatti per scontato che il lettore abbia un minimo di pratica con Asp e con le tecniche di manipolazione dei record estratti da una fonte di dati di tipo ADO.

Se così non fosse, si consiglia di consultare il Manuale di Asp ed il Manuale di Sql di questo sito.

Registrazione dei messaggi

La fase successiva, nonchè conclusiva del lavoro, è quella della registrazione dei messaggi sul database, implementiamo il file inserisci.asp, di cui adesso esaminiamo il codice:
<%@LANGUAGE = JScript%>
<%
   //Recupero i dati dal form
   var nickname = new String(Request.Form("nickname"));
   var email = new String(Request.Form("email"));
   var homepage = new String(Request.Form("homepage"));
   var citta = new String(Request.Form("citta"));
   var oggetto = new String(Request.Form("oggetto"));
   var messaggio = new String(Request.Form("messaggio"));

   //Scrivo la data
   var oggi = new Date();
   var data = oggi.getDate() + "/"
            + (oggi.getMonth() + 1) + "/"
            + oggi.getYear() + " alle ore "
            + oggi.getHours() + ":"
            + oggi.getMinutes() + ":"
            + oggi.getSeconds();

   //Controllo i campi obbligatori
   if ((nickname == "") || (nickname == "undefined")) Response.Redirect("index.asp");
   if ((citta == "") || (citta == "undefined")) Response.Redirect("index.asp");
   if ((oggetto == "") || (oggetto == "undefined")) Response.Redirect("index.asp");
   if ((messaggio == "") || (messaggio == "undefined")) Response.Redirect("index.asp");

   //Creo la connessione ed il recordset
   var Cn = new ActiveXObject("ADODB.Connection");
   var Rs = new ActiveXObject("ADODB.Recordset");

   //Creo la stringa di connessione
   var Str = "driver={Microsoft Access Driver (*.mdb)};dbq=" + Server.MapPath("guestbook.mdb");

   //Apro la connessone
   Cn.Open(Str);

   //Apro il recordset, inserisco i nuovi dati, lo aggiorno e lo chiudo
   Rs.Open("messaggi",Cn,3,3);
      Rs.AddNew();
         Rs("nickname") = nickname;
         Rs("email") = email;
         Rs("homepage") = homepage;
         Rs("citta") = citta;
         Rs("oggetto") = oggetto;
         Rs("messaggio") = messaggio;
         Rs("data") = data;
      Rs.Update();
   Rs.Close();

   //Chiudo la connessione
   Cn.Close();

   //Reindirizzo immediatamente l'utente verso index.asp
   Response.Redirect("index.asp");
%>
Il funzionamento è semplice, recupero i dati richiesti dal modulo, scrivo manualmente la data impostata sull'ora del server Web su cui è pubblicato lo script, controllo i campi obbligatori, supponendo che l'email e la homepage non siano richiesti obbligatoriamente.
A questo punto mi connetto al database, inserisco i dati passati dal modulo, chiudo la connessione e reindirizzo istantaneamente l'utente al file originale, aggiornato con il proprio messaggio in capo alla lista.

I più cliccati della sezione Asp

:: Un semplice form mail in Asp (51.682)

:: Creazione di un'area di accesso riservato in Asp (45.423)

:: Connessione ad un database MySql con Asp (25.044)

:: Connessione ad un database Microsoft SQL Server con Asp (24.069)

:: Asp e database (23.123)

:: Differenza tra i metodi get e post e recupero dei dati, attraverso Asp (22.301)

:: Una semplice area di accesso riservato senza DB in Asp (21.384)

:: Riscrivere le URL con Asp (19.743)

:: Creazione di un Sondaggio in Asp (19.100)

:: Report di stampa da database a Ms Word con Asp (18.715)

IN EVIDENZA
DOWNLOAD