[PHP] Pattern PRG (Post/Redirect/Get)

Rispondi
Roberto
Amministratore
Messaggi: 160
Iscritto il: 19/12/2009, 19:30

[PHP] Pattern PRG (Post/Redirect/Get)

Messaggio da Roberto »

Questa procedura serve a prevenire la duplicazione di operazioni lato client a seguito di una form. E' noto che tramite una form vengono generate delle richieste HTTP che prevedono l'utilizzo del metodo POST ed uno dei problemi in cui ogni programmatore si e' imbattuto riguarda la possibilita' che un utente dopo aver eseguito la forma effettui un Refresh (un aggiornamento) della pagina generando una nuova ma identica richiesta causando una duplicazione di operazioni o inserimento dati su database.

Soluzioni, talvolta anche bizzarre, ce ne sono a decine ma la piu' logica e' quella prevista dal pattern PRG il quale suggerisce di utilizzare il metodo POST soltanto per l'invio dei dati della form e l'esecuzione di operazioni ed alla fine utilizzare un comando di reindirizzamento per far vedere l'output agli utenti.

HTTP 1.1 (RFC 2616) ha infatti introdotto il codice di risposta HTTP 303 See Other per gestire questi tipi di situazioni e assicurare che se l'utente effettua un refresh della pagina non venga generata una nuova esecuzione del codice.

La realizzazione di questo pattern e' abbastanza semplice, utilizzando il linguaggio di programmazione PHP (ma puo' essere realizzata in qualunque linguaggio) in linee generali sono necessari tre file:

1) form.php in cui sara' presenta la form dove l'utente inserira' i dati da inviare

Codice: Seleziona tutto

<form name="NomeForm" action="elaborazione.php" method="post">

...i vari input...

</form>
2) elaborazione.php che effettuera' l'elaborazione dei dati inviati dalla form ed alla fine il reindirizzamento ad una pagina di risposta

...elaborazione dei dati...

Codice: Seleziona tutto

header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/risposta.php");
die();
3) risposta.php che si occupa di rispondere all'elaborazione dati effettuata da elaborazione.php

Codice: Seleziona tutto

<p>Elaborazione della form effettuata con successo!!!</p>
A questo punto se l'utente effettua un refresh della pagina di risposta otterra' lo stesso identico messaggio ma non verra' rieseguito il codice di elaborazione.

I piu' attenti di voi si chiederanno come mai all'inizio di questa discussione e' stato menzionato anche il metodo GET se fin qui non e' mai stato utilizzato; tale metodo non e' che un potenziamento di cio' che possiamo fare, infatti se abbiamo la necessita' di legare la pagina di risposta a dati inviati tramite la form basta semplicemente inviarli tramite GET in fase di reindirizzamento:

in elaborazione.php avremo

Codice: Seleziona tutto

header("Location: http://$_SERVER[HTTP_HOST]/risposta.php?formInput1=$_POST['formInput1']");
in risposta.php avremo

Codice: Seleziona tutto

echo $_GET['formInput1'];
Un'ultima e non meno importante possibilita' di questo pattern e' quella di utilizzare anche solo 2 file anziche' 3 come descritto finora inserendo la form e la risposta in un unico file e mantenere l'elaborazione separata in un secondo file.

Roberto Basile
Rispondi