Con ColdFusion possiamo creare facilmente un sistema per inserire nuovi record nel database. Prima di tutto si crea un modulo che permette l'inserimento delle informazioni; in secondo luogo, il codice che inserisce queste informazioni nel database.
1. salva in un nuovo file inserimento.cfm un modulo creato con <cfform>. Dà ad ogni campo del modulo il nome esatto del corrispondente campo nella tabella ALBUM
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data">
<table>
<tr>
<td>
<p>Titolo: </p>
</td>
<td>
<cfinput name="ALBUM_TITOLO" type="text" size="30" maxlength="150" required="yes" message="Inserisci un titolo per questo album.">
</td>
</tr>
<tr>
<td>
<p>Autore: </p>
</td>
<td>
<cfinput name="ALBUM_AUTORE" type="text" size="30" maxlength="150" required="yes" message="Inserisci un autore per questo album.">
</td>
</tr>
<tr>
<td>
<p>Etichetta: </p>
</td>
<td>
<cfinput name="ALBUM_ETICH" type="text" size="30" maxlength="150" required="yes" message="Inserisci l'etichetta di questo album.">
</td>
</tr>
<tr>
<td valign="top">
<p>Descrizione:</p>
</td>
<td>
<textarea name="ALBUM_DESCR" cols="30" rows="5"></textarea>
</td>
</tr>
<tr>
<td>
<p>Genere: </p>
</td>
<td>
<cfinput name="ALBUM_GENERE" type="text" size="30" maxlength="150" required="yes" message="Inserisci il genere della musica di questo album.">
</td>
</tr>
<tr>
<td>
<p>Immagine: </p>
</td>
<td>
<input name="ALBUM_IMG" type="file" size="30">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="Inserisci record">
</td>
</tr>
</table>
</cfform>
<cfinclude template="footer.cfm">
Non tutti i campi di un modulo possono essere generati da ColdFusion. Ad esempio, non esiste in CFML una <textarea> o un tag <input type="file">. Là dove possiamo è bene usare il tag <cfinput> per un controllo sui dati obbligatori.
Poiché il form permette anche l'invio di un file, abbiamo dovuto mettere l'attributo enctype="multipart/form-data" nel tag <cfform>.
L'action del form punta allo stesso file che lo contiene, inserimento.cfm. All'interno del file inserimento.cfm aggiungeremo quindi il codice che permette l'inserimento del record: codice che dovrà essere eseguito solamente quando è stato inviato il form. Come abbiamo già visto,
l'invio di un form restituisce una serie di variabili con scope "form" e nome quello dei campi del modulo. Se il modulo non è stato inviato, queste variabili non sono esistenti, non sono cioè "definite". In CFML si usa la funzione IsDefined() per controllare se una variabile è definita.
2. Inserisci all'inizio del file inserimento.cfm il controllo per verificare se è definita la variabile form.ALBUM_TITOLO:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<!--- Il modulo è stato inviato --->
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
Quando si invia il modulo, insieme ai contenuti dei vari campi viene inviato un file: <input name="ALBUM_IMG" type="file" size="30">. I byte che compongono quest'immagine sono trasferiti dal client al server. Nel database, però, non dobbiamo inserire questa informazione, ma semplicemente il nome del file. Non solo, il file inviato dovrà essere scritto sul server per poter essere visualizzato nel sito, e più precisamente salvato nella cartella "album" dove risiedono le altre immagini; questo processo si chiama upload (caricamento).
Una volta eseguito l'upload, potremo inserire i vari dati dell'album nel database, compreso il nome dell'immagine appena caricata sul server.
3. Ovviamente, prima di fare l'upload del file dobbiamo assicurarci che il campo ALBUM_IMG non sia vuoto. Anche qui, è sufficiente inserire un <cfif>:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<cfif form.ALBUM_IMG NEQ "">
<!--- Esegue l'upload dell'immagine sul server --->
</cfif>
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
Il tag adibito a lavorare con i file è <cffile>. Ad esso è sempre associato un attributo "action" che identifica l'azione che <cffile> deve eseguire: ad esempio, action="write" indicherà a <cffile> di scrivere un file; action="delete" di cancellare un file; action="rename" di rinominare, e così via. Per eseguire l'upload di un file sul server, si utilizza l'attributo action="upload".
E' obbligatorio specificare l'attributo "filefield", che identifica il nome del campo file del modulo; è obbligatorio l'attributo "destination", che indica il percorso assoluto sul server dove deve essere caricato il file. Utilizzando, inoltre, l'attributo nameconflict="makeunique", possiamo dire a ColdFusion di rinominare il file sul server se ne è già presente uno con lo stesso nome.
Molto più semplicemente, basterà scrivere questa riga:
<cffile action="upload" filefield="ALBUM_IMG" destination="C:CFusionMXwwwrootdiscotecaalbum" nameconflict="makeunique">
per eseguire l'upload di un file nella cartella C:CFusionMXwwwrootdiscotecaalbum.
4. Aggiungi quindi <cffile> in inserimento.cfm:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<cfif form.ALBUM_IMG NEQ "">
<!--- Esegue l'upload dell'immagine sul server --->
<cffile action="upload" filefield="ALBUM_IMG" destination="C:CFusionMXwwwrootdiscotecaalbum" nameconflict="makeunique">
</cfif>
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
quando il file è stato trasferito sul server, possiamo conoscerne il nome utilizzando la variabile "cffile.ServerFile". Questo nome sarà inserito nel nuovo record.
5. Attribuiamo quindi alla variabile form.ALBUM_IMG, proveniente dal form, il valore di cffile.ServerFile:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<cfif form.ALBUM_IMG NEQ "">
<!--- Esegue l'upload dell'immagine sul server --->
<cffile action="upload" filefield="ALBUM_IMG" destination="C:CFusionMXwwwrootdiscotecaalbum" nameconflict="makeunique">
<cfset form.ALBUM_IMG = cffile.ServerFile>
</cfif>
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
6. Per inserire il nuovo record nel database, usiamo il tag <cfinsert>. Negli attributi dobbiamo specificare il data source name da utilizzare, la tabella da aggiornare e i campi del modulo da cui provengono le informazioni:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<cfif form.ALBUM_IMG NEQ "">
<!--- Esegue l'upload dell'immagine sul server --->
<cffile action="upload" filefield="ALBUM_IMG" destination="C:CFusionMXwwwrootdiscotecaalbum" nameconflict="makeunique">
<cfset form.ALBUM_IMG = cffile.ServerFile>
</cfif>
<!--- Inserisce il nuovo record nel datasource discoteca --->
<cfinsert datasource="discoteca" tablename="ALBUM" formfields="ALBUM_TITOLO,ALBUM_AUTORE,ALBUM_ETICH,ALBUM_DESCR, ALBUM_GENERE,ALBUM_IMG">
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
Il tag <cfinsert> esegue un INSERT via SQL e riconosce i campi della tabella da aggiornare, in base al nome dei campi del modulo di inserimento: per questo motivo abbiamo dovuto creare il modulo utilizzando gli stessi nomi dei campi del database.
Naturalmente, anziché usare <cfinsert> avremmo potuto scrivere "a mano" la stringa di SQL, che avremmo passato al solito tag <cfquery>. Il <cfquery> corrispondente al <cfinsert> è in questo caso:
<cfquery name="insertrecord" datasource="discoteca">
INSERT INTO ALBUM (ALBUM_TITOLO,ALBUM_AUTORE,ALBUM_ETICH,ALBUM_DESCR, ALBUM_GENERE,ALBUM_IMG)
VALUES ('#form.ALBUM_TITOLO#', '#form.ALBUM_AUTORE#', '#form.ALBUM_ETICH#', '#form.ALBUM_DESCR#', '#form.ALBUM_GENERE#', '#form.ALBUM_IMG#')
</cfquery>
utilizzando i valori contenuti nelle variabili "form" e gli apici, poiché si tratta di campi di testo. Anche per i <cfquery> di inserimento gli attributi da inserire sono "name" e "datasource". Con <cfquery> non è necessario che i nomi dei campi del modulo siano gli stessi di quelli del database.
7. Per concludere, dopo l'inserimento del record inseriamo un messaggio di conferma. Per visualizzarlo dopo l'intestazione del sito, dichiariamo una nuova variabile dopo <cfinsert>:
<!--- inserimento.cfm: inserisce un nuovo record nel database --->
<!--- Verifica che sia stato inviato il modulo --->
<cfif IsDefined('form.ALBUM_TITOLO')>
<cfif form.ALBUM_IMG NEQ "">
<!--- Esegue l'upload dell'immagine sul server --->
<cffile action="upload" filefield="ALBUM_IMG" destination="C:CFusionMXwwwrootdiscotecaalbum" nameconflict="makeunique">
<cfset form.ALBUM_IMG = cffile.ServerFile>
</cfif>
<!--- Inserisce il nuovo record nel datasource discoteca --->
<cfinsert datasource="discoteca" tablename="ALBUM" formfields="ALBUM_TITOLO,ALBUM_AUTORE,ALBUM_ETICH,ALBUM_DESCR, ALBUM_GENERE,ALBUM_IMG">
<!--- Dichiarazione di una variabile per confermare l'inserimento --->
<cfset inserimentoOK = 'Il nuovo album è stato aggiunto.'>
</cfif>
<cfinclude template="header.cfm">
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
8. solo nel caso in cui questa variabile sia stata definita potremo mostrare il valore: dopo <cfinclude template="header.cfm"> inseriamo un <cfif> e un <cfoutput>:
......
<cfinclude template="header.cfm">
<!--- se è definita la variabile inserimentoOK significa che l'inserimento è stato eseguito e che possiamo visualizzare il messaggio --->
<cfif isDefined('inserimentoOK')>
<p><cfoutput>#inserimentoOK#</cfoutput></p>
</cfif>
<p class="titolo">Inserimento di un nuovo album</p>
<cfform action="inserimento.cfm" enctype="multipart/form-data"> ......
Fai ora delle prove di inserimento di nuovi album, provando anche a sostituire a <cfinsert> il <cfquery> "insertrecord". Se vuoi confrontare il file inserimento.cfm con quello che ho scritto io, lo puoi scaricare da qui.