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


<<< Verifica dell'input

Esaminiamo adesso la gestione di una form in PHP. La schermata principale, descritta in dettaglio nel prossimo paragrafo relativo ai database, comprende una serie di bottoni. Premendo Nuova Ditta oppure Modifica Ditta viene invocata la pagina company.inc, mentre premendo Nuovo Contatto oppure Modifica Contatto viene invocata la pagina contact.inc. Esaminiamo adesso queste pagine. In Figura 2 sono mostrate le schermate che si ottengono.


Figura2 - Schermate per l'immissione di una ditta e di un contatto.

Esaminiamo passo passo il testo del file contact.inc:

<? // File: contact.inc
if($Contact) $Contact = webquote($Contact); ?>

Questa pagina stampata una form che inizializza con le informazioni contenute nell'array associativo Contact. L'origine di queste informazioni è il database oppure la form stessa. Il contenuto di Contact in ogni caso non è codificato in modo da poter essere visualizzate in maniera corretta in una pagina HTML: infatti caratteri speciali come le virgolette o i segni di maggiore o minore devono essere codificate con sequenze come &quot;, &gt; o &lt;. La prima operazione da effettuare per consentire la stampa della form è trasformare ogni elemento contenuto in un formato stampabile con l'HTML. Questo è lo scopo della funzione webquote, il cui codice è un esempio sia di gestione array che di stringhe:

// File: functions.inc
 Function webquote($a) {
	$b = array();
	while(list($k,$v) = each($a)) 
	  $b[$k]=str_replace("'", "&#39;", htmlspecialchars($v));
	return $b;
 }

In questa procedura possiamo notare la funzione htmlspecialchars che effettua le principali codifiche dell'HTML, ma che purtroppo non codifica l'apice, che è pure necessario. Abbiamo rimediato codificandolo direttamente con str_replace. Il PHP ha un insieme di funzioni stringa molto nutrito che comprende anche strcmp per il confronto alfabetico (ritorna -1 se la prima è minore della seconda, 0 se sono uguali e 1 se la prima è maggiore della seconda), e strlen che restituisce la lunghezza di una stringa. Ritorniamo a contact.inc ed esaminiamo la form:

<form>
<? echo "<input type=hidden name=Contact[idContact] value='$Contact[idContact]'>"
?>
<table border=0 cellpadding=4 cellspacing=0>
<tr bgcolor=#abcdef><th colspan=2>Inserimento Contatto
<tr bgcolor=#eeeeee><td colspan=2>Ditta
<br>
<select name=Contact[fkCompany]>
<? option_company() ?>
</select>
<tr bgcolor=#eeeeee><td colspan=2>Nome
     <br><? echo "<input type=text size=50 name=Contact[FirstName]
value='$Contact[FirstName]'>" ?>
<tr bgcolor=#eeeeee><td colspan=2>Cognome
    <br><? echo "<input type=text size=50 name=Contact[LastName]
value='$Contact[LastName]'>" ?>
<tr bgcolor=#eeeeee><td>Telefono Casa
    <br><? echo "<input type=text size=20 name=Contact[Home] 
value='$Contact[Home]'>" ?>
    <td>Telefono Cellulare
    <br><? echo "<input type=text size=20 name=Contact[Mobile]
value='$Contact[Mobile]'>" ?>
<tr bgcolor=#eeeeee><td colspan=2>Email
    <br><? echo "<input type=text size=30 name=Contact[Email]
value='$Contact[Email]'>" ?>

Notare che la form prevede anche un elenco a discesa delle possibili ditte, elenco che viene generato a parte interrogando il database da option_company.

Per illustrare appieno il funzionamento di questa form occorre tenere presenta cosa avviene sia prima che dopo l'invocazione. Consideriamo il caso più semplice: un utente preme il bottone Nuovo Contatto. In tal caso manda in esecuzione il seguente codice di agenda.php:

// File: agenda.php
...
} else if($op==NEW_CONTACT) {
	include("contact.inc");
} ...

In questo modo la form viene invocata con Contact che non contiene nulla (perché non viene inizializzato), e il risultato (che è quello voluto) è di presentare la form con tutti i campi vuoti. In ogni caso il codice è scritto come appena visto per poter coprire anche il caso in cui l'utente sceglie Modifica Contatto e attiva il seguente frammento in agenda.php:

// File: agenda.php
...
} else if($op==EDIT_CONTACT) {
	if($Contact = select_contact($idContact)) {
	   include("contact.inc");
	} else {
	   setErr(ERR_NOKEY);
	   include("list.inc");
	}
}...

In questo modo l'array Contact viene riempito estraendo le informazioni dal database tramite la funzione select_contact descritta più avanti. Notare che la selezione può avere successo (se l'utente seleziona uno dei bottoni radio mostrati nell'elenco) o può fallire. In quest'ultimo caso viene rivisualizzato l'elenco con un messaggio di errore. Nel caso positivo, tutti i valori necessari per riempire la form sono presenti nell'array Contact e sono utilizzati per dare il valore predefinito ai campi della form impostando l'attributo VALUE..

Ai campi della form è stato assegnato un nome compatibile con la sintassi del PHP, in modo da essere assegnati ad un array associativo. Questo meccanismo è estremamente comodo per semplificare le operazioni: permette di raggruppare i dati e consente di uniformare la gestione di una form con la gestione del database. In effetti, l'array Contact può essere originato da una interrogazione del database o da una form, ma il codice nonse ne cura: il formato dei dati è lo stesso, un array associativo con le chiavi corrispondenti ai campi. Completiamo il listato di contact.inc:

<tr bgcolor=#abcdef><td colspan=2 align=center>
<?
	echo "<input name=op type=submit value='".SAVE_CONTACT."'>";
	echo "&nbsp;";
	echo "<input name=op type=submit	 value=Annulla>";
?>
<tr bgcolor=#abcdef><td colspan=2><? echo showErr() ?>

</table>
</form>

Notare che il nome del campo SUBMIT è op e che per il campo VALUE del bottone è stata usata una delle costanti corrispondenti ai bottoni, le stessa costanti che vengono confrontate in agenda.php. Premendo il bottone che presenta l'etichetta Salva Contatto viene richimato il seguente frammento di codice di agenda.php:

// File: agenda.php
...
} else if($op==SAVE_CONTACT) {
	if(check_contact()) {
		insert_update_contact();
		include("list.inc");	
	} else
		include("contact.inc");
} else {
	include("list.inc");	
} ...

I valori della form sono stati assegnati agli elementi dell'array associativo Contact. La funzione check_contact() assume proprio questo, e se ritorna un valore falso (che indica che le verifiche sono fallite) viene richiamato contact.inc; questo mostra nuovamente i valori selezionati, provenienti questa volta non dal database ma dalla form stessa. Se invece la verifica dei dati immessi ha successo, l'inserimento di un nuovo record o l'aggiornamento di uno esistente viene eseguita dalla funzione insert_update_contact(). La funzione di verifica check_contact() è semplicemente:

 // File: functions.inc
 Function check_contact() { 	
	global $Contact;
	if(!$Contact['FirstName']) 
		return setErr(ERR_NO_DATA, "nome mancante");
	if(!$Contact['LastName']) 
		return setErr(ERR_NO_DATA, "cognome mancante");
	return 1;
 }

Questa funzione si limita a verifica la presenza di nome e cognome, ma può essere resa sofisticata come si vuole.

Esaminiamo adesso le funzioni relative al trattamento degli errori. Innanzitutto definiamo delle costanti corrispondenti a messaggi di errore standard:

 //File: functions.inc
 // errori
 define(OK, "");
 define(ERR_NOKEY, "Non è stato selezionato alcun elemento");
 define(ERR_NO_DATA, "Campo mancante");
 define(ERR_FAIL_UPDATE, "Aggiornamento del database fallito");
 define(ERR_CANNOT_DELETE, "Non posso cancellare");

La gestione di errore viene effettuata dalle funzioni setErr(), getErr() e showErr()

 //------------------------------------------------------------------------
 // Gestione Errori
 //------------------------------------------------------------------------
 $Error = "";
 $ErrorMsg = "";
 Function setErr($err, $msg="")
 {
	global $Error, $ErrorMsg;
	$Error = $err;
	$ErrorMsg = $msg;
	return 0; 
 }

 Function getErr() {
	global $Error, $ErrorMsg;
	
	if(!$Error) 
	 return "";
	$err = "<b>Errore!</b> $Error";
	if($ErrorMsg) 
 	  $err .=": $ErrorMsg.";
	else 
	  $err .= ".";
	return $err;
 }

 Function showErr() {
	$err = getErr();
	setErr(OK);
	return $err;
 }

La funzione setErr() imposta il messaggio di errore corrente e ritorna sempre falso, e questo è utile per impostare il codice di errore e ritornare dal punto in cui si è verificato un errore. In questo modo si può scrivere:

if(errore!)
  return setErr(codice, messaggio);

invece di

if(errore!) {
  setErr(codice, messaggio);
  return 0;
}

La funzione setErr accetta un errore standard definito da una serie di costanti, e un eventuale messaggio aggiuntivo che può essere aggiunto per chiarire la ragione di un errore. Notare che l'errore è mantenuto in una variabile globale che memorizza l'ultimo errore riscontrato. La funzione getErr() ritorna una stringa di errore composta in base ai valori trovati nelle variabili globali Error ed ErrorMsg. Poiché le variabili contenenti i messaggi di errore una volta notificati all'utente devono essere azzerate (altrimenti un messaggio di errore continuerebbe ad essere visualizzato), la funzione showErr() oltre a stampare il messaggio lo azzera. La funzione getErr() è comunque sempre disponibile per essere utilizzata per leggere il messaggio senza cancellarlo, operazione utile quando si vogliono effettuare delle registrazioni e lasciare al codice che visualizza il messaggio il compito di cancellarlo.

Completiamo il paragrafo mostrando il codice della gestione ditte senza ulteriori commenti, poiché è simile alla gestione contatti (anzi più semplice). Al lettore l'esercizio di leggerlo e di comprenderlo nei dettagli.

// File: company.inc
<? if($Company) $Company = webquote($Company); ?>
<form>
<? echo "<input type=hidden name=Company[idCompany] 
                value='$Company[idCompany]'>"
?>
<table border=0 cellpadding=4 cellspacing=0>
<tr bgcolor=#abcdef><th colspan=2 >Inserimento Ditta
<tr bgcolor=#dddddd><td colspan=2>Ditta
     <br><? echo "<input type=text name=Company[Name] 
                            value='$Company[Name]' size=50>"  ?>
<tr bgcolor=#dddddd><td colspan=2>Via
     <br><? echo "<input type=text name=Company[Street] 
                            value='$Company[Street]' size=50>"  ?>
<tr bgcolor=#dddddd><td>Città
    <br><? echo "<input type=text name=Company[City] 
                            value='$Company[City]' size=35>"  ?>
    <td>Prov.
    <br><? echo "<input type=text name=Company[State] 
                            value='$Company[State]' size=2>"  ?>
<tr bgcolor=#dddddd><td>Telefono
    <br><? echo "<input type=text name=Company[Phone] 
                            value='$Company[Phone]' size=20>"  ?>
    <td>Fax
    <br><? echo "<input type=text name=Company[Fax] 
                            value='$Company[Fax]' size=20>" ?>
<tr bgcolor=#dddddd><td>Email
    <br><? echo "<input type=text name=Company[Email] 
                            value='$Company[Email]' size=30>"  ?>
    <td>Web
    <br><? echo "<input type=text name=Company[Web] 
                            value='$Company[Web]' size=30>"  ?>
<tr bgcolor=#abcdef><td colspan=2 align=center>
<?
	echo "<input name=op type=submit 
                            value='".SAVE_COMPANY."'>";
	echo "&nbsp;";
	echo "<input name=op type=submit 
                            value=Annulla>"; ?>
<tr bgcolor=#abcdef><td colspan=2><? echo showErr() ?>
</table>
</form>

La funzione di verifica dell'input è:

// File: functions.inc
 Function check_company() { 
	global $Company;
	if(!$Company[Name])  
		return setErr(ERR_NO_DATA, "nome ditta");
	if(!($Company[City] and $Company[State])) 
		return setErr(ERR_NO_DATA, "città o provincia");
	if(!$Company[Phone]) 
		return setErr(ERR_NO_DATA, "numero di telefono");
	return 1;
 }
ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com