Newsgroup: it.comp.www.php
Titolo: Evitare il doppio invio di un form

Buongiorno a tutti,
ho un form che invia tutti i suoi dati al file elaborate.php; in questo file 
si fanno tutti i controlli del caso (ke nessuno dei campi sia vuoto, ke la 
login inserita non esista già nel db Mysql etc etc) quindi si scrive a video 
il riassunto dei dati inseriti ed infine si chiede di confermare 
definitivamente oppure modificare qualche campo.
Nel caso di ulteriore (e definitiva) conferma tutte le variabili d'interesse 
vengono inviate al file add_user.php che appunto provvede ad inserisce il 
record in questione nella tabella.
Ora mi sono accorto che se clicco velocemente N volte su quest'ultimo tasto 
conferma (quello cioè del file elaborate.php), mi vengono inseriti N record 
uguali nella tabella, mentre in verità io vorrei che me ne venisse aggiunto 
uno solo...
Come eliminare questo inconveniente? Mi vengono in mente due possibili 
soluzioni, una a posteriori -se vedo che nella mia tabella ci sono N record 
perfettamente uguali ne cancello N-1....ma non mi piace come soluzione- ed 
una a priori -faccio qualche controllo sul tasto "conferma" in modo tale che 
mi vanga accettato solo il primo invio e non i successivi-
A logica mi vien da dire che questa seconda opzione sia quella giusta....il 
problema mio è che non ho la più pallida idea di come implementarla...
Qualcuno per favore mi può dare qualche suggerimento?
Grazie 1000 in anticipo!
Paolo 

 ha scritto nel messaggio 
news:6SJOd.867374$35.33...@news4.tin.it...


 inseriscila
Se come DB usi mysql, io farei cosi:
LOCK della tabella
QUERY di insert
UNLOCK della tabella
Dovresti riuscire a lockare la tabella evitanto query simultanee.
-- 
"Il Guerriero della Luce non tenta di sembrare. Egli č."
GPG key: 
http://www.syntonyze.net/~syntonyze/gpg/gpg_key.asc

 Dovresti riuscire a lockare la tabella evitanto query simultanee.
   Scusate se mi intrometto ma, in linea di massima, *non* dovrebbero 
esistere due o più righe uguali, in una tabella. Intendo dire che, 
probabilmente, il discorso si può ridurre all'inserimento di un vincolo 
di unicità, anche per mezzo di una chiave primaria ben progettata, e poi 
lasciare il compito del controllo suggerito da "Shark" al DBMS stesso 
(con annessa verifica della presenza di errori dopo ogni tentativo di 
inserimento).
   Tra l'altro, mi sembra di aver capito che il problema si verifica in 
uno script che censisce utenti per un'applicazione (o qualcosa del 
genere), il che rafforza la mia ipotesi iniziale: è il progettista della 
base dati che deve farsi carico di implementare l'impossibilità di 
moltiplicare la stessa istanza dell'oggetto utente, come, certamente, da 
/requirement/.
-- 
Alla prossima,
Marco

   Scusate se mi intrometto ma
Scusate se mi intrometto, ma non sarebbe piu' banale disabilitare il 
tasto "Invio" del form appena viene cliccato? Io faccio sempre cosi', in 
questo modo il form puo' essere inviato una sola volta, e non c'e' alcun 
bisogno di fare operazioni strane sul database...
-- 
Falco Stellare - 
falco.ste...@graphicside.it
<< Togli il TAPPO per rispondermi >>


In effetti questa cosa che suggerisci è proprio quella che farebbe al caso 
mio! Sinceramente non lo so fare, quindi ho cercato un bel po' con google, 
ma l'unica cosa che ho trovato è come fare a disabilitare il tasto "invio" 
della tastiera (com ad es. in 
http://basic.html.it/domande/view.asp?iddomanda=55
). Mi potreste dire qual'è 
la funzione che permette di disabilitare il tasto "Invio" del form appena 
viene cliccato?
Grazie ancora a tutti
Paolo 

 record in questione nella tabella.
adduser.php strutturalo come segue
-> esiste la riga che si vuole inserire ?
  -> NO inseriscila
  -> SI fai nulla oppure qualche altra cosa (tipo msg errore)
risolvi ogni problema
ciao
Alesi_27

 bisogno di fare operazioni strane sul database...
   Se vi piace complicarvi la vita... Perņ poi mi devi spiegare come si 
fa a impedire che un altro utente, per dolo o per colpa, inserisca gli 
stessi dati oppure che, ricaricando la pagina di risposta 
all'inserzione, essi vengano nuovamente inviati e nuovamente inseriti 
nella tabella.
-- 
Alla prossima,
Marco

 ha scritto nel messaggio 
news:_UVOd.525548$b5.24...@news3.tin.it...

In effetti ho messo questa condizione if () prima di inviare il comando 
INSERT a MySql, proprio come mi hai suggerito, ed ora tutto funziona bene se 
anke clikko più di una volta cmq il record viene inserito una volta sola!
Grazie ancora per le vostre gentili ed utili risposte!
Paolo 

 nella tabella.
Ma dai, su...
E' ovvio che devono esistere dei controlli sul database, pero' penso che 
formalmente si debbano prevedere azioni e interventi solo dove servono 
affinche' avvengano solo quando servono. Bloccare il pulsante di invio 
del form e' cosa semplicissima e gia' in partenza ti taglia la 
possibilita' del doppio invio, eliminando cosi' l'evenienza che l'utente 
possa piu' o meno involontariamente duplicare i dati che sta inviando. 
Ne discende che il database non dovra' affrontare lo scenario del doppio 
invio se non in un assai ristretto numero di casi (vedi l'utente che 
ricarica la pagina e la reinvia, cosa non certo frequente come la 
possibilita' del clic a raffica sul pulsante di invio).


 aggiunto uno solo...
Io di solito faccio un controllo utilizzando javascript (che qui è OT).
In breve utilizzo una variabile che imposto ad 1 una volta che il tasto
submit, per esempio, è stato premuto.
<code>
 <form method="post" action="....">
  <input ....>
  <input ...>
  <input type="submit" onclick="if (submit_gia_cliccato!=1)
{ submit_gia_cliccato=1; }">
</code>
-- 
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===