ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | PHP | Espressioni | Comandi | Libreria | Form | Cookie | Database | Config | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
Tutorial PHP
Gestione Form
Verifica dell'input


<<< Gestione Form >>>


Figura 1 Diagramma della Agenda Contatti

Il diagramma va letto come segue: i nodi rettangolari rappresentano nodi di "smistamento" delle azioni che vengono richieste, mentre i nodi circolari rappresentano la visualizzazione dei risultati. In PHP, ad differenza della programmazione CGI classica in cui è più semplice distinguere tra pagine e script, si hanno solamente pagine. Per risolvere questo problema utilizzeremo una "pagina" che realmente non visualizza nulla, ma esegue delle azioni. Una volta che una azione viene eseguita, in risposta alle necessità vengono richiamate, tramite include, le pagine vere e proprie che visualizzano i risultati delle operazioni. L'applicazione è pertanto composta dai seguenti file:
File Descrizione
agenda.php Il file principale dell'applicazione.
Decide le azioni da effettuare in base ai bottoni premuti
Include gli altri file in base all'azione scelta.
list.inc Visualizza l'agenda.
Elenca le ditte e i contatti per ditta
company.inc Form per l'immissione e la modifica delle ditte
contact.inc Form per l'immissione e la modifica dei contatti
options.inc Form per la modifica delle opzioni di visualizzazione
functions.inc Raccolta di funzioni e definizioni di costanti.
La maggior parte delle operazioni non visuali
sono effettuate da funzioni raccolte in questo file.

Nella maggior parte dei casi, l'azione da eseguire viene scelta in base al bottone che viene premuto. Un bottone in HTML viene rappresentato da un campo <INPUT TYPE=SUBMIT NAME=nome VALUE=etichetta>. Quando il bottone viene premuto lo script che viene indicato come destinatario ottiene in input un campo chiamato con il nome che ha come valore l' etichetta specificata nel tag. Allo scopo di uniformare la gestione, scegliamo di chiamare tutti i campi di input con lo stesso nome, op, e di centralizzare la gestione delle azioni da effettuare nella pagina principale, impostando come action di tutte le form la pagina agenda.php.

Ogni form quindi richiama agenda.php; questo script trova sempre nella variabile op l'azione da eseguire. Una serie di if a cascata selezionano l'azione da effettuare, chiamano la funzione opportuna e infine visualizzano i risultati includendo (con include) la pagina da visualizzazione. Esaminiamo adesso il codice che implementa questa impostazione. Prima di tutto definiamo alcune costanti, corrispondenti ai bottoni che appaiono nell'applicazione:

 // File: functions.inc
 // etichette dei bottoni
 define(NEW_COMPANY, "Nuova Ditta");
 define(EDIT_COMPANY, "Modifica Ditta");
 define(DELETE_COMPANY, "Elimina Ditta");
 define(SAVE_COMPANY, "Salva Ditta");

 define(NEW_CONTACT, "Nuovo Contatto");
 define(EDIT_CONTACT, "Modifica Contatto");
 define(DELETE_CONTACT, "Elimina Contatto");
 define(SAVE_CONTACT, "Salva Contatto");

 define(EDIT_OPTIONS, "Modifica Opzioni");
 define(SAVE_OPTIONS, "Salva Opzioni");

Il codice di agenda.php è:

<? //File: agenda.php
   require("functions.inc");
   // necessario porlo qui: bisogna impostare
   // i cookie prima di ogni altra cosa
   Header("pragma", "no-cache");
   if($op==SAVE_OPTIONS) 
	save_options($opt);
?>
<html>
<head>
  <title>Agenda</title>
</head>

<body bgcolor=#ffffff>
<? 
if($op==EDIT_OPTIONS) {
	include("options.inc");
} else if($op==SAVE_OPTIONS) {
	include("list.inc");
} else if($op==NEW_COMPANY) {
	include("company.inc");
} else if($op==EDIT_COMPANY) {
	if($Company = select_company($idCompany)) {
		include("company.inc");
	} else {
		setErr(ERR_NOKEY);
	  	include("list.inc");
	}
} else if($op==SAVE_COMPANY) {
	if(check_company()) {
		insert_update_company();
		include("list.inc");
	} else {
		include("company.inc");
	}
} else if($op==DELETE_COMPANY) {
	if($idCompany)
		delete_company($idCompany);
	else
		setErr(ERR_NOKEY);
	include("list.inc");	
} else if($op==NEW_CONTACT) {
	include("contact.inc");
} else if($op==EDIT_CONTACT) {
	if($Contact = select_contact($idContact)) {
	   include("contact.inc");
	} else {
	   setErr(ERR_NOKEY);
	   include("list.inc");
	}
} else if($op==DELETE_CONTACT) {
	if($idContact)
		delete_contact($idContact);
	else
		setErr(ERR_NOKEY);
	include("list.inc");	
} else if($op==SAVE_CONTACT) {
	if(check_contact()) {
		insert_update_contact();
		include("list.inc");	
	} else
		include("contact.inc");
} else {
	include("list.inc");	
}
?>
</body>
</html>

Il file inizia con un require('functions.inc') che carica tutte le funzioni di gestione che per comodità sono state scritte in un file separato.

ATTN: Ricordiamo che una pagina inviata da un Web Server inizia sempre con una serie di intestazioni che forniscono informazioni aggiuntive. Alcune funzioni utilizzano le intestazioni per comunicare con il browser. Per questo motivo in PHP queste funzioni devono essere poste immediatamente all'inizio di una pagina, prima ancora che venga generato qualsiasi testo HTML. Infatti l'intestazione deve venire viene inviata prima del documento. Quando si richiamano le funzioni suddette dopo che si è già scritto qualcosa che appartiene al corpo del documento, le intestazioni a questo punto non possono più essere inviate, l'operazione viene ignorata e viene generato un messaggio di avvertimento.

La funzione che genera intestazioni sono, in questo caso, la SetCookie la Header. La prima genera un cookie, mentre la seconda genera una richiesta al browser di disabilitare il caching delle pagine. I cookie che servono a memorizzare variabili nel browser, e a mantenere quindi uno stato dell'applicazione, come vedremo nel prossimo paragrafo. Per quanto riguarda la disabilitazione della cache, bisogna tenere presente che il browser, allo scopo di evitare il caricamento ripetuto della stessa pagina (operazione comune quando l'utente naviga nel web e torna indietro ad una pagina già vista), memorizza le pagine già viste in una copia locale. Purtroppo le applicazioni Web tipicamente generano le pagine dinamicamente, e il caching solitamente crea più confusione che aiuto: per esempio se l'utente modifica il database inserendo un nuovo elemento e poi torna alla pagina indice, lo stesso URL che ha visualizzato la vecchia situazione dovrà visualizzare quella relativa al nuovo database. Se è attivo il caching viene visualizzata la vecchia pagina, quindi l'utente non vede il nuovo elemento che è stato inserito anche se effettivamente il database è cambiato. Allo scopo di evitare questi problemi, si comunica al browser di disabilitare il caching per quella pagina. Un modo è quello di utilizzare l'intestazione non standard (ma accettata dai principali browser) pragma con il valore no-cache. In generale la funzione Header genera (sempre che sia chiamata prima di generare altri output) l'intestazione appropriata per il browser. Nel nostro caso, la funzione save_options genera, come vedremo, le intestazioni necessarie per salvare informazioni di stato sull'applicazioni utilizzando i cookie.

Il resto della pagina è composta da una serie di if a cascata che scelgono l'azione da effettuare in base al valore della variabile op. Si tratta di una traduzione in codice di quanto mostrato nello schema di figura 1.

ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com