back to top

Form PHP: gestire i dati inseriti nei moduli del sito

Una delle operazioni più comuni di interazione tra un sito web ed i suoi utenti, consiste nella compilazione di moduli (o form). In questo articolo vedremo in che modo chiunque può implementare un form con PHP all’interno del proprio sito web per effettuare una serie di operazioni di vario tipo e natura come, ad esempio, l’invio di email o l’inserimento di dati in un database.

Introduzione: i moduli in HTML

Per chi non lo sapesse, un modulo è composto da un insieme di tag HTML il cui scopo è raccogliere gli input dell’utente: possiamo avere caselle di testo, strumenti di selezione, strumenti di scelta (alternativa e multipla), strumenti per l’upload di file, ecc. Attraverso tutti questi strumenti, l’utente inserisce dei dati ed esprime delle preferenze che potranno essere oggetto di archiviazione e/o di elaborazione da parte di uno script.

In questa sede non ritengo opportuno tornare su concetti propri del linguaggio di markup ed invito, pertanto, il lettore interessato a leggere questa lezione della nostra Guida ad HTML per una rinfrescata su <form> e sugli altri tag per la creazione di moduli.

Quello che a noi interessa, in questa sede, è di capire in che modo uno script PHP può raccogliere ed elaborare i dati raccolti mediante un form.

Trasmissione dei dati: i metodi GET e POST

I form possono inviare dati ad una pagina web mediante due diverse metodologie di trasporto che prendono il nome di GET e POST.

Il metodo utilizzato deve essere specificato dallo sviluppatore all’interno del codice HTML del form attraverso l’attributo method in questo modo:

<form method="post" action="mioscript.php">
...
...
...
</form>

Sulla base di quanto specificato nell’attributo method ("get" o "post") dovremo conformare il codice della pagina che andrà a processare la richiesta (ovvero il file specificato nell’attributo action).

Quando i dati vengono inviati col metodo GET, questi sono trasmessi sotto forma di query-string. In altre parole, quando il form verrà inviato dall’utente, il browser effettuerà un redirect sulla pagina specificata nel parametro action accodando – all’interno della URL – i valori dei diversi campi del modulo, in questo modo:

mioscript.php?campo1=valore1&campo2=valore2&campo3=valore3

Come potete vedere i valori sono trasmessi "in chiaro" alla pagina web ricevente sotto forma di coppie di parametri/valori, tra loro concatenate mediante il simbolo della "E commerciale" (&).

Viceversa, se il modulo viene inviato col metodo POST, tutti questi valori saranno trasmessi alla pagina web in modo "trasparente" per l’utente, nel senso che i parametri ed i rispettivi valori non saranno visibili nella URL della pagina, ma saranno inviati all’interno della "parte invisibile" della trasmissione HTTP che avviene tra il client ed il server.

La raccolta dei dati inviati tramite un modulo da parte di uno script PHP

Fino ad ora abbia fatto un semplice ripasso circa il funzionamento dei moduli HTML ed il modo in cui consentono di trasmettere dei dati ad una specifica pagina web (uno script). Vediamo ora in che modo PHP è in grado di raccogliere i dati che sono stati raccolti ed inviati tramite un form.

Per farlo PHP dispone di due variabili globali corrispondenti ai due metodi di invio visti poco sopra. Le due variabili in questione prendono il nome di $_GET e $_POST. Queste due variabili sono valorizzate in automatico da PHP e contengono, sotto forma di array, tutti i valori ricevuti tramite il metodo GET ed il metodo POST (per maggiori informazioni si faccia riferimento a questa lezione della nostra Guida PHP).

Il funzionamento di queste variabili è identico: essendo delle array, è possibile recuperare il valore di un dato parametro semplicemente specificandone il nome tra parentesi quadra, in questo modo:

// recupero il valore del parametro 'campo1' trasmesso mediante query-string (metodo GET)
$campo1 = $_GET['campo1'];

// recupero il valore del parametro 'campo1' trasmesso mediante il metodo POST
$campo1 = $_POST['campo1'];

In altre parole: il valore del campo, presente nel nostro modulo HTML, avente come nome "campo1" può essere recuperato da PHP sfruttando, appunto, le variabili globali $_GET o $_POST (a seconda del method specificato nel tag <form>).

Facciamo un semplicissimo esempio pratico. Supponiamo di avere un form che chiede all’utente di inserire il proprio indirizzo email:

<form method="post" action="mioscript.php">
  Inserisci il tuo indirizzo email<br>
  <input type="text" name="email"><br>
  <input type="submit" value="Invia Modulo">
</form>

Vediamo quindi il corrispondente script PHP che, al submit del form, raccoglie questa informazione e – molto banalmente – la stampa a video:

<?php
$email = $_POST['email'];
echo 'Il tuo indirizzo email è: ' . $email;
>

L’output prodotto sarà qualcosa di questo tipo:

Il tuo indirizzo email è: [email protected]

Oltre alle variabili $_GET e $_POST, PHP offre anche una terza opzione: la variabile $_REQUEST. Questa variabile può essere utilizzata quando non si sa se il dato viene recapitato tramite il metodo GET o il metodo POST, essendo questa variabile una sorta di "mix" di entrambe:

// recupero il valore del parametro 'campo1' (sia GET che POST)
$campo1 = $_REQUEST['campo1'];

Si faccia attenzione però, in quanto questa variabile contiene – oltre ai valori trasmessi via GET e POST – anche i valori presenti nella variabile globale $_COOKIE. A titolo personale non ne consiglio l’utilizzo se non in casi di effettivo bisogno.

Creare un modulo di contatto in PHP

Una delle esigenze tipiche quando si crea un sito web consiste nella creazione di un modulo di contatto che consenta agli utenti di inviarci delle comunicazioni. Molto spesso mi viene chiesto "Come si crea un modulo di contatto in HTML?" La risposta è: "Non si può". HTML, infatti, è un linguaggio di markup – e non di scripting – e non offre pertanto la possibilità di gestire autonomamente questo tipo di esigenze.

E’ in questa prima e comunissima esigenza che PHP rivela la sua potenza e versatilità nell’interazione coi moduli. Vediamo, quindi, come creare un semplicissimo modulo di contatto con PHP, partendo dal markup HTML:

<form method="post" action="formmail.php">
  Inserisci il tuo nome<br>
  <input type="text" name="nome"><br>
  Inserisci il tuo indirizzo email<br>
  <input type="text" name="email"><br>
  Scrivi un messaggio:<br>
  <textarea name="msg"></textarea><br>
  <input type="submit" value="Invia Modulo">
</form>

Vediamo ora il codice PHP del nostro file "formmail.php":

<?php
// Recupero i valori inseriti nel form
$nome = $_POST['nome'];
$email = $_POST['email'];
$msg = $_POST['msg'];

// compilo un messaggio combinando i dati recuperati dal form
$testo = "Nome: " . $nome . "\n"
       . "Email: " . $email . "\n"
       . "Messaggio:\n" . $msg;

// uso la funzione mail di PHP per inviare questi dati al mio indirizzo di posta
mail('[email protected]', 'Messaggio dal mio sito web', $testo);

// Mostro un messaggio di conferma all'utente
echo 'Grazie per averci contattato!';
?>

Quello proposto è un esempio rudimentale che, tuttavia, assolve bene il compito di mostrare in che modo PHP riesca ad interagire coi moduli per generare, ad esempio, una email all’atto del loro submit. Per maggiori informazioni sulle caratteristiche e le potenzialità della funzione mail() di PHP vi invito a leggere questa lezione della nostra Guida a PHP.

Archiviazione dei dati all’interno di un database MySQL

Altra funzionalità tipica nella gestione dei moduli con PHP, consiste nell’archiviazione dei dati (inseriti dall’utente nei vari campi di un form) all’interno di una base dati. Per semplictà faremo riferimento al database MySQL essendo il più diffuso in combinazione con questo linguaggio di scripting lato server.

Ancora una volta partiamo dal markup HTML di un semplice modulo di raccolta dati anagrafici per la registrazione ad un dato servizio:

<form method="post" action="registrazione.php">
  Inserisci il tuo nome<br>
  <input type="text" name="nome"><br>
  Inserisci il tuo cognome<br>
  <input type="text" name="cognome"><br>
  Inserisci il tuo indirizzo email<br>
  <input type="text" name="email"><br>
  Scegli una password<br>
  <input type="text" name="pass"><br>
  <input type="submit" value="Registrati">
</form>

Vediamo ora il sorgente dello script che effettua materialmente la registrazione dell’utente salvandone i dati all’interno di un database:

<?php
// Recupero i valori inseriti nel form
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$email = $_POST['email'];
$password = $_POST['pass'];

// dati di connessione al mio database MySQL
$db_host = 'localhost';
$db_user = '...';
$db_pass = '...';
$db_name = '...';

// connessione al DB utilizzando MySQLi
$cn = new mysqli($db_host, $db_user, $db_pass, $db_name);

// verifica su eventuali errori di connessione
if ($cn->connect_errno) {
    echo "Connessione fallita: ". $cn->connect_error . ".";
    exit();
}

// definisco la query di inserimento dati
$sql = "INSERT INTO utenti (nome, cognome, email, password) VALUES ("
     . "'" . $nome . "',"
     . "'" . $cognome . "',"
     . "'" . $email . "',"
     . "'" . $password . "')"

// esecuzione della query
if (!$cn->query($sql)) {
  echo "Errore della query: " . $cn->error . ".";
}else{
  echo "Registrazione effettuata correttamente.";
}

// chiusura della connessione
$cn->close();

Ancora una volta sembra tutto piuttosto semplice: PHP recupera i dati inseriti dall’utente all’interno del modulo, poi li utilizza all’interno di una query SQL che viene eseguita per effettuare l’inserimento dati all’interno del database (per maggiori informazioni sull’interazione tra PHP e MySQL consiglio la lettura di questa guida). Ancora una volta, però, quello proposto non è niente di più che un esempio scolastico la cui finalità non va oltre a quella puramente didattica: mettere in produzione questo script, infatti, sarebbe alquanto rischioso…

Il problema della sicurezza dei dati inviati coi moduli

Sino ad ora ci siamo limitati a mostrare in che modo è possibile gestire i form con PHP all’interno di "un mondo ideale" dove l’utente fa sempre e solamente quello che lo sviluppatore vorrebbe… peccato che nella realtà dei fatti non è sempre così.

Il buon sviluppatore, infatti, è ben cosciente dei rischi che si nascondono all’interno dei moduli e – più in generale – sa quanto sia importante effettuare un’accurata verifica e validazione di tutti i dati ricevuti in input dagli utenti.

Nell’esempio precedente, infatti, sarebbe piuttosto semplice, per un malintenzionato, attuare un attacco mediante la tecnica della SQL Injection: sarebbe sufficiente valorizzare ad hoc uno dei campi del nostro modulo di iscrizione, infatti, per compromettere la riservatezza e l’integrità del nostro database!

Quando si parla di gestione dei form con PHP, quindi, non si può non affrontare la tematica della sicurezza dei moduli al fine di prevenire attacchi di SQL Injection e Cross-Site Scripting (solo per citare le due minacce più diffuse).

A tal fine la raccomandazione è sempre la stessa: assicuratevi, prima di processare un modulo, che i dati inseriti al suo interno siano conformi ai valori che vi attendete da un utilizzatore corretto. Per fare un esempio: all’interno di un ipotetico campo "email" deve essere inserito un valido indirizzo email, così come all’interno di un ipotetico campo "età" deve essere scritto un valore di tipo numerico.

A tal fine PHP offre numerose funzioni ad hoc, vediamo di seguito un esempio di sequenza di controllo dei dati inseriti in un form:

// Recupero i valori inseriti nel form
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$email = $_POST['email'];
$eta = $_POST['eta'];

// verifico che tutti i campi siano stati compilati
if (!$nome || !$cognome || !$email || !$eta) {
  echo 'Tutti i campi del modulo sono obbligatori!';    
}
// verifico che il nome non contenga caratteri nocivi
elseif (!preg_match('/^[A-Za-z \'-]+$/i',$nome)) {
  echo 'Il nome contiene caratteri non ammessi';    
}
// verifico che il cognome non contenga caratteri nocivi
elseif (!preg_match('/^[A-Za-z \'-]+$/i',$cognome)) {
  echo 'Il cognome contiene caratteri non ammessi';    
}
// verifico se un indirizzo email è valido
elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo 'Indirizzo email non corretto';
}
// verifico che il campo età sia numerico, non sia inferiore di 1 e maggiore di 120
elseif (!is_numeric($eta) || $eta < 1 || $eta > 120) {
  echo 'Campo età non corretto';  
}else{
  // A QUESTO PUNTO POSSO PROCESSARE IL FORM
  // ...
  // ...
  // ...   
}

Altra utile precauzione consiste nell’utilizzo di funzioni di escape dei caratteri speciali prima dell’inserimento dei dati, ricevuti in input, all’interno di una query SQL: esempio tipico sono le funzioni addslashes() e, soprattutto, mysql_real_escape_string() e mysqli_real_escape_string(). In alternativa è possibile (e consigliabile) utilizzare la sintassi dei Prepared Statements di MySQLi che garantiscono una gestione sicura ed efficiente dei dati inseriti all’interno delle query SQL.

Altre funzioni molto utili quando si lavora coi form con PHP sono htmlspecialchars(), htmlentities() e strip_tags(): si tratta di tre funzioni native di PHP che è bene ricordare ed utilizzare nelle situazioni in cui è necessario prevenire attacchi di tipo XSS (Cross-Site Scripting) come, ad esempio, nei guestbook e nei forum o – più in generale – in tutte quelle situazioni in cui i dati passati in input da un utente vengono incorprati in una pagina visibile anche ad altri.

Conclusioni

PHP è un linguaggio estremamente potente e versatile grazie al quale non è particolarmente complicato gestire i dati ricevuti in input dagli utenti tramite dei moduli HTML. Se la sintassi di base può apparire piuttosto semplice, tuttavia, è opportuno ricordarsi che una implementazione "basica" può prestare il fianco a numerosi inconvenienti tra cui, soprattutto, quello di cadere vittima di qualche attacco informatico.

Nella gestione dei form con PHP, quindi, è opportuno prendere le dovute precauzioni ed effettuare sempre i necessari controlli al fine di verificare che i dati inseriti siano conformi a quelli attesi.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

Cannot modify header information – headers already sent: come risolvere l’errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare l’estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano l’orario corretto? Probabilmente...

5 script PHP per gestire BBCode

A volte può aversi l'esigenza di dover offrire agli...
Pubblicitร