Avatar billede hoejgaard Juniormester
09. juli 2005 - 19:34 Der er 33 kommentarer og
1 løsning

dobbelt submit af form

Hej.
jeg har nogle gange oplevet at hvis man klikker på submit et par gange efter hinanden så bliver formen submittet to gange, og data indsættes dobbelt i databasen.
kan man ikke undgå at det sker ??
Avatar billede busschou Praktikant
09. juli 2005 - 19:41 #1
Det er vel ikke nødvendigvis så underligt
Hver gang man submitter en form så kaldes dit bagved liggende script jo :o)
Så hvis du vil undgå det så skal du tjekke op på nogle af dine parametre før du indsætter i databasen.
Nu ved jeg ikke hvad det drejer sig om
Men feks kunne man tjekke på brugernavnet eller nyheds overskrift og sikre at der ikke kan dannes en dublet
Avatar billede busschou Praktikant
09. juli 2005 - 19:43 #2
Det er nok ikke noget du skal omgåes med dhtml, men derimod serverside i asp eller php afhængig af hvad du koder i
Du kan jo også komme ud for at en bruger trykker F5 , hvorefter browseren spørger om man vil sende data igen, og det er jo heller ikke så smart jo :o)
Avatar billede nielle Nybegynder
09. juli 2005 - 19:48 #3
En mulighed kunne være at generere en unik kode sammen med din form:

<form action=”ditScript.php” method=”post”>
<input type=”hidden” name=”formId” value=” ... en eller anden unik kode her ...”>
<input type=”text” name=”fornavn”>
...
<input type=”submit”>
</form>

- og så have en tabel i din database over de formId'er der er blevet brugt. Hvis der kommer en fomId som allerede er brugt afvises, og hvis den ikke er brugt så opdateres tabellen med det nye formId.
Avatar billede busschou Praktikant
09. juli 2005 - 19:50 #4
hmm ja det var vel egentlig en rimelig smart trick
Avatar billede hoejgaard Juniormester
09. juli 2005 - 20:07 #5
jamen danner den ikke nye formId 'er ved hvert submit ??
Avatar billede busschou Praktikant
09. juli 2005 - 20:10 #6
kun hvis du beder den om det!
Nielles forslag bygger netop på dette. At du genererer en kode hver gang formen hentes
Hver gang formen submittes så tester du i en tabel om koden findes, hvis ikke så indsætter du den og gør det du skal. Hvis den findes så fortæller du brugeren at han ikke kan submitte samme form to gange i træk
Avatar billede nielle Nybegynder
09. juli 2005 - 20:14 #7
Du kan endda sagtens sætte et tidsstempel på i tabellen sammen med dit formID, og så simpelthen slette dem som er f.eks. óver 10 minutter gamle. PÅ den måde kommer din tabel ikke til at fylde mere og mere med tiden.
Avatar billede Slettet bruger
09. juli 2005 - 20:39 #8
Jeg tror i glemmer at man stadig kan submitte formen hurtigt, 2 eller flere gange efter hinanden, hvis ellers den bagvedliggende side er lang tid om at blive indlæst.

Dengang Eksperten startede kunne man f.eks. lave 2 ens indlæg ved at trykke flere gange på submit, med et sekunds mellemrum.
Avatar billede busschou Praktikant
09. juli 2005 - 20:42 #9
Du kan submitte den ligeså tosset og meget du vil
Men hvis der hver gang tjekkes op med en database, så vil database kaldene komme i kø til databasen og efter det første kald vil resten jo så netop blive afvist :o)
Avatar billede busschou Praktikant
09. juli 2005 - 20:42 #10
Jeg mener at have læst exp´s løsning et sted herinde engang.
Mener det var noget med at den gensender headeren - kan det passe?
Avatar billede nielle Nybegynder
09. juli 2005 - 20:46 #11
el_barto> Øh, nej det glemmer vi da ikke. Det er jo det spørgsmålet handler om. Selvfølgelig kan man submitte 2/flere gange hurtigt, men ved at indføre et unikt formId sikre man sig at det netop kun er det ene af de flere submits' som rent faktisk kommer igennem.

Der er ikke nogen måde hvorpå at man kan forhindre dobbelt submit – eller det mere almindelige tilfælde hvor folk trykker på backspace og så prøver at sumbitte en gang til.
Avatar billede busschou Praktikant
09. juli 2005 - 20:48 #12
nielle, hvis du ser det er det herinde ikke muligt på exp at trykke tilbage og submitte din kommentar igen
Jeg mener altså det var nogen i php der engang sagde noget om at sende headeren videre som i fjernede muligheden for at gå tilbage...men er ikke 100 :/
Avatar billede roenving Novice
09. juli 2005 - 22:47 #13
Ekspertens løsning er at sende til en mellemside (respons.php) og derefter redirecte (faktisk replace !-) tilbage til samme side ...

-- men eksperten bruger også præcis tricket med at enhver udsendt form indeholder et unikt id, som den ikke vil acceptere mere end een gang i databasen !o]
Avatar billede hoejgaard Juniormester
09. juli 2005 - 22:54 #14
Hvordan kan jeg smartest danne en kode ved hvert kald af formen ??
Avatar billede nielle Nybegynder
09. juli 2005 - 22:57 #15
Hvilket serverside scriptsprog har du adgang til? ASP eller PHP?
Avatar billede hoejgaard Juniormester
09. juli 2005 - 23:13 #16
PHP
Avatar billede nielle Nybegynder
10. juli 2005 - 09:05 #17
En løsning kunne f.eks. være at generere et GUID og vedhæfte dette til formen:

http://theserverpages.com/php/manual/en/function.com-create-guid.php

- altså noget i denne stil:

<form action=”ditScript.php” method=”post”>
<input type=”hidden” name=”formId” value=”<?php echo com_create_guid(); ”>
<input type=”text” name=”fornavn”>
...
<input type=”submit”>
</form>
Avatar billede steent Nybegynder
10. juli 2005 - 09:34 #18
<input type="submit" onclick="this.disabled='true';">
Avatar billede busschou Praktikant
10. juli 2005 - 09:36 #19
steent >> Det fjerner vel ikke muligheden for at trykke F5 og få browseren til at gensende data?
Avatar billede nielle Nybegynder
15. juli 2005 - 06:54 #20
Har du fået kigget på det hoejgaard?
Avatar billede steent Nybegynder
15. juli 2005 - 08:20 #21
Nej det fjerner muligheden for at kunne klikke to gange på knappen, du submitter vel ikke til det samme script.
Avatar billede busschou Praktikant
15. juli 2005 - 08:34 #22
steent >> hvis man vil undgå at form data kan indsættes dobbelt i databasen, så er det bare ikke noget at gøre knappen disabled :o) om man submitter til samme script ? En form har mig bekendt kun een action så hvis du trykker f5 .. joo så submitter den da ganske vist til samme script , med mindre du mener noget andet?
Avatar billede steent Nybegynder
15. juli 2005 - 08:40 #23
busschou >> Problemet er jo velkendt fra betalingssider.

Den procedure jeg selv benytter er følgende:

1. Siden med formen poster til
2. Siden der gemmer i DB som sender brugeren til
3. Siden med en eller anden inforation der skal vises efter data fra form er gemt i DB
Avatar billede busschou Praktikant
15. juli 2005 - 08:44 #24
steent >> ja og hvis brugeren så klikker tilbage i browseren, så spørger den om man vil sende sin post data igen ?
Avatar billede busschou Praktikant
15. juli 2005 - 08:44 #25
steent>> man ser jo også på mange betalings sider at man ikke må klikke f5 fordi som der står, så vil man blive trukket dobbelt :o)
Avatar billede steent Nybegynder
15. juli 2005 - 08:50 #26
Det er dårlige betalingssider så, jeg har ikke problemet i de shop jeg har lavet. For man har jo et unikt ordrenr. at forholde sig til.

Alt i alt, dobbelt submit af data er temmelig nemt at undgå.
Avatar billede busschou Praktikant
15. juli 2005 - 08:57 #27
steent >> Jeg forstår dig bare ikke, hvordan kan du gøre alt det udelukkende ved at gøre submit knappen disabled? Du skriver selv at det kun fjerner muligheden for at trykke på knappen
Hvis du sender brugeren til en eller anden side som skal vise, og brugeren klikker tilbage og derved gensender data. Ja så bliver dataen skisme da gensendt, og kun _kun_ hvis du har kodet dig fra det undgår du at det bliver puttet i db igen. Det har du så tilsyneladende undgået ved at hver ordre har et unikt nummer som kun kan fremkomme i databasen een gang eller hvad? Jamen så er det jo der din sikkerhed ligger og ikke i at gøre knappen disabled :o)
Avatar billede steent Nybegynder
15. juli 2005 - 09:03 #28
Nej med at kanppen er disabled fjerner brugerens mulighed for at klikke på knappen 2 eller flere gange og derved undgår du 99,9% af alle de gange folk klikker på knappen fordi de ikke tror der sker noget. Alternativt kan man jo ændre teksten i knappen til 'Vent venligst' eller noget lignende.
Avatar billede busschou Praktikant
15. juli 2005 - 09:05 #29
steent >> ja den er jeg med på, man kan gøre det mere eller mindre usandsynlig for brugeren at lave fejl. Men hvis man gerne vil udelukke at det kan ske. Så er min pointe blot at det ikke er nok at gøre knappen disabled, og derfor kunne jeg ikke forstå at du hårdnakket påstod at du ikke havde problemet i din shop, for det må du da have hvis det er det eneste du har gjort.
Hvis man vil være helt sikker så må ved selve opdateringen af databasen lave et tjek på data af den ene eller anden art for at sikre det ikke bliver genindsat
Avatar billede steent Nybegynder
15. juli 2005 - 09:48 #30
Nemlig
Avatar billede nielle Nybegynder
19. juli 2005 - 20:44 #31
Har du fået kigget på det hoejgaard?
Avatar billede busschou Praktikant
27. juli 2005 - 15:50 #32
hoejgaard >> lukketid eller hvad?
Avatar billede nielle Nybegynder
12. august 2005 - 08:17 #33
?
Avatar billede nielle Nybegynder
16. september 2005 - 16:46 #34
Hmmm, var det vitterligt steent's svar du endte med at bruge eller har du bare accepteret dette svar fordi at det var det eneste som var givet?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester