Page Refresh na Form Submit
Stel een bezoeker heeft net een formulier verzonden en daarna vernieuwt hij de pagina. Als je geen controle inbouwt, worden de gegevens twee keer verzonden. Ik wil eens een elegante manier verzinnen om dat op te vangen.
Als het bijvoorbeeld gaat om het invoegen van de formuliergegevens in een db, zou je kunnen checken op dubbele records, maar misschien zijn er veel mooiere manieren. Ik ben benieuwd naar jullie gedachtes hierover?
Vroeger heb ik dit ook eens gedaan door gewoon een directe refresh na het posten, dat werktte toen ook wel, maar was niet zo handig.
Of je kan de stijl die men hier toepast gebruiken, posten, pagina dat het in orde is, en doorlinken, dan is vernieuwen ook niet meer mogelijk (tenzij je vernieuw op de pagina met tekst dat het in orde is ;))
Dat je een session aanmaakt bij het verzenden van de form, en als hij dan op een andere pagina komt, als het afgerond is, dat je hem dan unset ;)
En als hij dan refresh't, kijk dan of die session bestaat :P
Gewijzigd op 06/11/2005 13:26:00 door PurpleMadness -
Waarom stuur je de bezoeker niet gewoon opnieuw naar de pagina, waarom een refresh?
Volgens mij werkt header('Location: zoveel.php'); na het verzenden (dus aan het einde van de if-submit-lus) best aardig.
SanThe:
Waarom stuur je de bezoeker niet gewoon opnieuw naar de pagina, waarom een refresh?
Volgens mij bedoeld Jan dat wanneer de gebruiker zelf refresht, dan een dubbel iets krijgt...
Als je in je database één veld of een combinatie hebt van velden die 'uniek' zijn zal er geen dubbele invoer plaatshebben. En dan bedoel ik dus niet het id veld.
En als het formulier nou gebruikt wordt voor een doel waar geen database voor nodig is, zoals het e-mailen...
werkt goed!
@Jip: Je bent wel lastig jij...(geintje) Maar je hebt wéér gelijk. Vijf keer hetzelfde mailtje versturen is inderdaad een mogelijkheid. Tja, nou moet ik écht na gaan denken.
SanThe:
Waarom stuur je de bezoeker niet gewoon opnieuw naar de pagina, waarom een refresh?
Jip:
Volgens mij bedoeld Jan dat wanneer de gebruiker zelf refresht, dan een dubbel iets krijgt...
Klopt, dat bedoel ik. Ze klikken submit, of typen enter. Om de één of andere reden gaat het traag of ze snappen niet wat er gebeurt, en dan gaan ze zélf refreshen. Ik heb nog niet alle antwoorden op deze post gelezen, ga ik nu doen.
Gewijzigd op 06/11/2005 17:18:00 door Jan Koehoorn
Wat Sebastiaan zegt, met javascript de submit laten disablen werkt idd wel voor het voorkomen van 2 keer posten, maar niet voor het refreshen op de resultaat pagina. Daarom kies ik altijd voor het laten disablen van de submit button, het formulier laten verwerken en onderaan een header('Location: ...'); plaatsen. Dan voorkom je dat men 2 keer op submit klikt en de pagina waar je op uitkomt kan zo vaak je wil gerefresht worden :)
Oplossingen met PHP verdienen de voorkeur vind ik, want JavaScript is minder waterdicht.
Oplossingen met een time-out zijn natuurlijk minder gebruiksvriendelijk. Ik denk dat de andere forumleden die hier veel posten het met me eens zijn dat die time-out die je hier krijgt als je even snel op een stuk of wat posts wilt reageren toch een beetje irritant is. Het zou mooi zijn als het anders zou kunnen.
Iemand naar een andere pagina sturen werkt ook wel, maar dan kunnen ze altijd nog de back-toets van de browser gebruiken.
Ik denk zelf in deze richting:
1) maak een sessievariabele aan, waarin je de POST of de GET array opslaat.
2) als er een formulier verzonden wordt, op wat voor manier dan ook, hetzij door een klik op submit, hetzij door een druk op 'enter', hetzij door een handmatige page-refresh, vergelijk je de resultaat-array met de eventuele array die in de sessie opgeslagen is. Zijn ze hetzelfde, dan is er sprake van een dubbele post.
Any ideas?
Gewijzigd op 06/11/2005 17:32:00 door Jan Koehoorn
Werkt prima gen problemen mee gehad ;)
Han:
Ik heb gewoon dat ze maar 2x mogen reageren op 1 ding per dag...!
Werkt prima gen problemen mee gehad ;)
Werkt prima gen problemen mee gehad ;)
Bedoel je in een forum? Dat ze maar twee keer per dag op één topic mogen reageren?
SanThe:
Als je in je database één veld of een combinatie hebt van velden die 'uniek' zijn zal er geen dubbele invoer plaatshebben. En dan bedoel ik dus niet het id veld.
Zoiets zou ik me ook voor kunnen stellen. Dat MySQL kan eisen dat een bepaalde combinatie van velden uniek moet zijn.
Je zou in een input type hidden een bepaalde random waarde kunnen zetten (microtime md5 o.i.d) en die bij het verzenden in een sessie opslaan. Waneer de random waarde met de sessie overeenkomt, is de pagina 2 keer verstuurt.
Ja, dat is wel de beste oplossing denk ik... Dat ga ik zeker gebruiken..!
Jelmer:
Je zou in een input type hidden een bepaalde random waarde kunnen zetten (microtime md5 o.i.d) en die bij het verzenden in een sessie opslaan. Waneer de random waarde met de sessie overeenkomt, is de pagina 2 keer verstuurt.
Dat klinkt inderdaad goed! Simpel en elegant. Dan hoef je maar één waarde te controleren en niet een hele array.
edit: of in plaats met random iets maken met microtime () misschien?
edit2: sorry, niet goed gelezen. Jij stelde ook al microtime voor :s
Gewijzigd op 06/11/2005 18:26:00 door Jan Koehoorn
Jan:
Zoiets zou ik me ook voor kunnen stellen. Dat MySQL kan eisen dat een bepaalde combinatie van velden uniek moet zijn.
Je klinkt twijfelachtig. Maar dit bestaat, ik gebruik het zelf ook.
SanThe:
Je klinkt twijfelachtig. Maar dit bestaat, ik gebruik het zelf ook.
Klopt, ik wist inderdaad niet zeker of MySQL dit zou kunnen.
edit:
@SanThe: wat vind je van de Jelmer-variant?
Gewijzigd op 06/11/2005 18:25:00 door Jan Koehoorn