Newsgroup: it.comp.www.php
Titolo: evitare di rispedire dati tramite metodo porst

...supponiamo ad esempio di avere il risultato di un form che ha permesso di
memorizzare una serie di dati in un db.
Supponiamo inoltre che per una qualche ragione l'utente prema il tasto
"aggiorna", ed ignori il messaggio di avvertimento che lo informa che i
dati saranno inviati nuovamente.
Il risultato e' quindi la duplicazione nel db dei dati precedentemente
inviati.
Come posso fare per evitare una tale sciagura?
grazie a tutti
-- 
Questo messaggio si autodistruggera' entro 10"
    _     _
  o' |,=./ `o
     (o o)    
 ooO--(_)--Ooo-

Come posso fare per evitare una tale sciagura?
Controlli che i dati non esistano già nel db.
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Project Admin di "PHP Reservation - Online booking system" - 
http://phpreservation.sourceforge.net
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 
... si vabbe', ma non e' la cosa migliore.
Pensa al caso di un sito ecommerce:
  1* caso:
un cliente compra dieci penne bic, conclude l'acquisto e nel db vengono
memorizzati tutti i dati necessari.
Dopo dieci secondi pensa ... "cavolo!! me ne servono altre e dieci"
rimette nel carrello le dieci penne in piu' che gli servono e riconclude
l'acquisto. Nel db verranno quindi memorizzati due distinti ordini che
differiranno per data/orario, id ecc...
  2* caso:
un cliente compra dieci penne bic, conclude, l'acquisto e nel db vengono
memorizzati tutti i dati necessari.
Dopi dieci secondi preme il tasto "aggiorna", preme distrattamente "ok" o
"continua" e i dati vengono rinviati. Nel db verranno quindi memorizzati
due distinti ordini che differiranno per data/orario, id ecc...
a livello di dati registrati nel db non e' piu' quindi possibile tra un
acquisto reale ed uno "distratto".
Volevo quindi sapere se esisteva una soluzione a monte.
ridenghiu


 i dati saranno inviati nuovamente.
Proof of concept:
http://setecastronomy.stufftoread.com/index.php?page=functions&type=deta
il&IDContent=47
<?php 
/* 
* L'utilizzo delle sessioni e' arbitrario, 
* va bene qualsiasi sistema di archiviazione 
* persistente.
*/
session_start ();
if (!isset ($_SESSION['hashes']) || 
    !is_array ($_SESSION['hashes'])) {
	$_SESSION['hashes'] = array ();	
}
/* Logica dell'invio */
$_POST['hash'] = isset ($_POST['hash']) ? $_POST['hash'] : '';
if (isset ($_POST['action']) && 
    $_POST['action'] == 1) {
 
	if (!in_array ($_POST['hash'], $_SESSION['hashes'])) {
		$_SESSION['hashes'][] = $_POST['hash'];
		print ("Questa &egrave; la prima volte che invii questa form!");
 
		/* 
		* Inserisci qui il codice di gestione 
		* dei dati della form.
		*/
 
	} else {
		print ("Questa form &egrave; gi&agrave; stata inviata!");
		/* 
		* Inserisci qui il codice di gestione 
		* dell'errore.
		*/
	}
}
/*
* La variabile hash contiene un identificativo 
* univoco che distingue una determinata form/una
* precisa azione di submit. 
*/
$hash = md5 (microtime ());  
?>
<form method="post" action="<?php print ($_SERVER['PHP_SELF']); ?>">
<input type="hidden" name="hash" value="<?php print ($hash); ?>" />
<input type="text" name="test" value="this is a test" />
<input type="hidden" name="action" value="1" />
<input type="submit" value="Invia" />
</form>
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 
hhheeeeee.... e' praticamente il metodo che sto' usando. La differenza e'
che la variabile di sessione viene impostata come semplice variabile e non
come un array...
A sto' punto m'arrendo. Pensavo mi fosse sfuggito qualcosa nel sistema
d'implementazione del postdata in php, magari qualche funzioncina
seminascosta tra tutte quelle offerte da piaccappi...
grazie a tutti comunque


 seminascosta tra tutte quelle offerte da piaccappi...
Forse mi sfugge il problema.


 dati saranno inviati nuovamente.
Io faccio cosi':
nel post, fa l'insert nel database e quindi fa il redirect ad un'altra 
pagina; sul refresh viene caricata la pagina a cui hai fatto il redirect
semplice ma efficace