Adesso che sai recuperare un record dal database e metterne dentro uno nuovo non ci rimane un gran che da fare. Per fare qualcosa di utile cerchiamo allora di costruire un'applicazione che ci permetta di inserire delle informazioni nel database attraverso una form e di mostrarle quando visualizziamo una pagina. Per esempio: se volessimo mostrare notizie di attualità sul nostro sito e cambiarle ogni giorno, non sarebbe meglio automatizzare il lavoro invece di scrivere HTML in continuazione? Io penso di sì!
Allora scriviamo il pseudocodice che descrive l'applicazione:
Input
Se la form è vuota
Mostrala
Se no
Entra I dati nel database
Output
Prendi il recordset dal database
Formattalo e mostralo all'utente
Subito costruiamo un'altra tabella per questa applicazione dove mettiamo i seguenti campi:
tbl_news | |
Nome campo | Tipo campo |
Id | primary key |
Titolo | Text |
Sottotitolo | Memo |
Testo | Memo |
Data_vivo | date/time |
Data_morto | date/time |
Hai fatto? Via! La form la fai con gli occhi chiusi. Io, qui sotto, modifico quella che abbiamo già fatto per il feedback, è quasi uguale. Salva questa form e chiamala news.inc Io uso i file include (.inc) di rado, ma ora voglio farti vedere un po' tutte le maniere in cui si può lavorare.
<-- NEWS.INC-->
<-- input form per le news applicazione-->
<HTML>
<HEAD>
<TITLE>News Input</TITLE>
</head>
</HEAD>
<BODY>
'usiamo questa flag per controllare se la form è stata mandata
<FORM ACTION="news.asp?submitted=true" METHOD="post">
<div align="center">
<table border="0" width="95%" celpadding="2" cellspacing="2">
<tr>
<td><h1>Entra le news per oggi qui...
<hr align="LEFT" size="1" width="100%" color="navy"></h1>
</td>
</tr>
<td align="center"><br><br>
<table width="80%" border="0" celpadding="2" cellspacing="2">
<tr>
<td>Titolo</td>
<td><INPUT NAME="titolo" TYPE="TEXT" size="80" MAXLENGTH="80"></td>
</tr>
<tr>
<td>Sottotitolo</td>
<td valign="top">
<TEXTAREA NAME="sottotitolo" ROWS="3" COLS="60"></TEXTAREA>
</td>
</tr>
<tr>
<tr>
<td valign="top">News</td>
<td><TEXTAREA NAME="news" ROWS="10" COLS="60"></TEXTAREA></td>
</tr>
<tr>
<td nowrap>Data di entrata</td>
<td valign="top">
<INPUT NAME="vivo" TYPE="TEXT" Value="<%= Now() %>" size="24" MAXLENGTH="24">
</td>
</tr>
<tr>
<td nowrap>Data di scadenza</td>
<td valign="top">
<INPUT NAME="morto" TYPE="TEXT" size="24" MAXLENGTH="24">
</td>
</tr>
<tr>
<td valign="top"><b> </b></td>
<td>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<table width="40%" border="0" celpadding="6" cellspacing="2">
<tr>
<td align="right">
<INPUT TYPE="submit" NAME="submit" VALUE="Entra">
</td>
<td align="left">
<INPUT TYPE="reset" NAME="Reset" VALUE="Reset">
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</FORM>
</BODY>
</HTML>
L'unica cosa che ancora non hai visto qui è la maniera in cui inseriamo il valore dalla data di oggi. Mi sembra che ne abbiamo parlato in precedenza. Inutile farlo a mano, no?
<tr>
<td nowrap>Data di entrata</td>
<td valign="top">
<INPUT NAME="vivo" TYPE="TEXT" Value="<%= Now() %>" size="24" MAXLENGTH="24">
</td>
</tr>
Le date sono sempre un po' problematiche con le banche dati e nel maneggiarle di sicuro ti verrà qualche capello bianco. Infatti paesi diversi adoperano formati diversi. Per esempio negli USA la data è sempre riportata come mese/giorno/anno, mentre in Europa è giorno/mese/anno. A dirti la verità io odio le date ma, hey! Non si può farne a meno.
Adesso mettiamoci intorno il resto del programma adoperando quella library che abbiamo già fatto attrezzi_db.asp. Includendola abbiamo accesso alle nostre funzioni.
<%
Option Explicit
'--------------------------------------------------------
'Purpose: applicazione per le news
'Date: 30 March 2001
'Commenti:
'--------------------------------------------------------
%>
<!-- la mia è nella stessa folder -->
<!-- #include file="attrezzi_db.asp" -->
<%
Dim strConn, message
Dim titolo, sottotitolo, testo, vivo, morto
call Main()
Sub Main()
'--------------------------------------------------------
'Purpose: la logica dell'applicazione
'Date: 29 March 2001
'Commenti:
'--------------------------------------------------------
Dim submitted, query, form
submitted = Request.QueryString("submitted")
If submitted then
call vendemmia(form)
query = costruisci_query(titolo,sottotitolo,testo,vivo,morto)
strConn = Application("dbconn")
'questa è in attrezzi_db.inc, ti ricordi? quindi ce l'abbiamo
call fai_query(strConn, query)
call quale_risultato(message)
else
%>
<!-- mettiamo la form qui -->
<!-- #include file="news.inc"-->
<%
end if
end Sub
Sub vendemmia(form)
'--------------------------------------------------------
'Purpose: raccogli i dati dalla form
'Date: 29 March 2001
'Commenti: corregge il problema di "
'--------------------------------------------------------
'questo Replace lo facciamo per il carattere """
'altrimenti la Database si confonde
titolo = Replace(Request.Form("titolo"),"'","''")
sottotitolo = Replace(Request.Form("sottotitolo"),"'","''")
testo = Replace(Request.Form("news"),"'","''")
vivo = Request.Form("vivo")
morto = Request.Form("morto")
end sub
Function costruisci_query(titolo,sottotitolo,news,vivo,morto)
'--------------------------------------------------------
'Purpose: costruisce la query
'Date: 29 March 2001
'Commenti:
'--------------------------------------------------------
Dim strsql
strsql = "INSERT INTO tbl_news ( titolo, sottotitolo, testo, data_vivo, data_morto)"
strsql = strsql & " Values('"
strsql = strsql & titolo & "','"
strsql = strsql & sottotitolo & "','"
strsql = strsql & testo & "','"
strsql = strsql & vivo & "','"
strsql = strsql & morto & "')"
'se hai dei guai costruendo questa, metti un
'Response.Write strsql & "<br>"
'così la vedi e la puoi accomodare
costruisci_query = strsql
End Function
Sub quale_risultato(message)
'--------------------------------------------------------
'Purpose: cronaca il risultato della query e formatta una risposta
'Date: 29 March 2001
'Commenti:
'--------------------------------------------------------
Select case message
case "ok"
response.write "Tutto è andato bene, <br> e grazie per il pesce."
response.write "<br><br><div align='center'><a href='JavaScript:history.back()'>Click to go back</a></div>"
case "not ok"
response.write "È un grosso disastro! <br> Chissa cosa è successo?"
response.write "Prova a scrivere la query e altre variabili per vedere se riesci a risolvere il problema."
response.write "<br>Anche la professione del falegname è onorevole ;o)"
response.write "<br><br><div align='center'><a href='JavaScript:history.back()'>Click to go back</a></div>"
case else
response.write "Se sei qui è metafisica pura"
end select
end sub
%>
Non è un gran che diverso da quello che abbiamo già fatto prima. Ma come sempre quando si comincia a scrivere il codice il pseudocodice si espande e così il nostro originale è diventato:
Input
Se la form NON è vuota
includi il file attrezzi.asp
vendemmia la form
costruisci la query
esegui la query
chek per errori
Entra I dati nelil database
cronaca il risultato
Se no
Mostra la Form
finito
Costruire la query, cosa che ancora non avevamo fatto, è sempre un po' difficile ma richiede solo attenzione. Le prime volte è sempre meglio stamparla così si vede cosa non va. Più che altro stai attento alla sintassi mettendola in ordine come ho fatto io, o ancora di più se vuoi. Ordine is GOOD!
Per esempio guarda come spesso si programma in ASP:
<%
strsql = "INSERT INTO tbl_news ( titolo, sottotitolo, _
testo, data_vivo, data_morto) Values ('"_
& titolo& "','" & sottotitolo & "' , ' " & testo &_
"','" &vivo& "','" & morto & "')"
%>
Come fai a vedere errori di sintassi qui? e questa è una query da bambini. Ancora meglio di quello che ho fatto io sarebbe:
<%
strsql = "INSERT INTO tbl_news"
strsql = strsql & "("
strsql = strsql & "titolo,"
strsql = strsql & "sottotitolo,"
strsql = strsql & "testo,"
strsql = strsql & "data_vivo, "
strsql = strsql & "data_morto)"
strsql = strsql & " Values('"
strsql = strsql & titolo
strsql = strsql & "','"
strsql = strsql & sottotitolo
strsql = strsql & "','"
strsql = strsql & testo
strsql = strsql & "','"
strsql = strsql & vivo
strsql = strsql & "','"
strsql = strsql & morto
strsql = strsql & "')"
%>
Vedi come è più facile trovare errori con un buon layout? Un altro cambiamento è avvenuto nella nostra fai_query(), la funzione che esegue la query. Quando si fanno delle query al database c'è sempre la possibilità che qualche cosa non funzioni e così è indispensabile controllare ogni errore. Guarda come abbiamo modificato il code di fai_query():
<%
On Error Resume Next
objConn.Execute strSQL
if err = 0 then
objConn.Close
set objConn = Nothing
message = "ok"
else
message = "not ok"
end if
%>
la linea On Error Resume Next forza il programma a continuare in caso di errore. Se non c'è un errore, l'oggetto Error rimane a zero e noi implementiamo un flag che dice "ok" ma se un errore è occorso allora mandiamo un messaggio al nostro utente per dirgli che qualcosa non ha funzionato. La nuova procedura quale_risultato(message) manda il messaggio che vogliamo noi invece di uno che vuole Microsoft.
Allora tutto quello che rimane è formattare l'Output.