13. april 2005 - 18:55Der er
14 kommentarer og 2 løsninger
Hvordan renser jeg min response buffer?
Jeg er ved at kode et lille system i php, da det skal være 100% idiot sikret, må man ikke kunne trykke F5 (reload siden) for så sendes informationer igen til siden (og opretter derved en ny artikel eller lign.), hvordan kan man rense sin response buffer, således man ikke får den der dialog boks når man reloader, hvor der står at kan ikke kan loade siden igen uden at skulle sende informationerne igen... eller er der en anden måde at undgå det på?
De fleste virksomheder har efterhånden bevist, at AI virker.
Pilotprojekter leverer resultater. Medarbejdere bruger generative AI-værktøjer. Nye use cases dukker op på tværs af organisationen.
Du kan ikke bestemme hvordan browseren opfører sig. Så du må lave et tjekt på om du allerede har gemt informationerne.
Et forslag kunne være at bruge session.
1) Når en form submittes, beregner du en md5hash af værdierne 2) du tester om session indeholder en "sidste-md5", i så fald, sammenlign disse to værdier .. Er de ens, er der submittet det samme to gange i træk. 3) du gemmer den ny md5hash i session.
Ja den er nem, men den løser ikke problemet i alle tilfælde ("100% idiot sikkert") hvis der fx. er begrænset resourcer så kan submitten sagents blive sendt og før der er modtaget response kan man nå at trykke reload.
Det ser indimellem.
(Når dette er sagt, så med mindre jeg laver et lib til forms, så bruger jeg også header() - det er forholdvis sjældent at folk når det)
Jeg har en side (artikler.php) hvor jeg viser alle artikler. Når brugeren vil oprette en ny artikel bliver han sendt til en opretartikel.php side med en form hvor han skal skrive artiklen. Når han trykker submit ryger han tilbage til den første side (artikler.php) hvor jeg tester for om der er nogle data fra formen på opretartikel.php. HVis der er data indsætter jeg dem i databasen og viser eller resten af siden (inklusiv den nye artikel). Hvis brugeren nu reloader bliver dataene fra opretartikel.php sendt igen og jeg får en ny artikel magen til den gamle...
jeg får artikler.php hvor alle artikler er listet, opretartikel.php hvor man opretter en ny artikel og DoOpretArtikel.php der indsætter artiklen i databasen og navigerer brugeren videre til artikler.php.
Tja, problemet er vel ikke så stort. Du kan også lave det en del af opretartikel.php - så den submitter til sig selv. Så kan du også bedre vise fejlmeddelelser og lade brugeren gen-indtaste ting.
dennismp >> To klumper hash fra to forskellige pushere kan sagtens være ens ;o)
At sammenligne to md5-hashes er absolut heller ikke nogen 100%-garanti. Er de to hashes ens, er det ikke nødvendigvis udtryk for, de to oprindelige strenge er ens. Det er sandsynligt - men ikke sikkert :)
Det er jeg klar over, men ser det for temmelig usandsynlig at een bruger får 2 ens md5-hashes i træk i sammme session - ved tilfældighed. Der hvor man skal passe på (tænke sig om) er om brugeren legitimt kan submitte det samme to gange. Men hvis man syntes det er et problem, så kan man da bare gemme hele data-sættet istedet.
"Temmelig usandsynlig" skal forstås på den måde at header-løsningen har en meget meget større sandsynlighed for at give problemet. Men det er lidt omstændigt at lave hver gange - med mindre man har lavet et library/framework til det - som man genbruger.
Det samme kunne jo også laves med en simpel tæller. Sættes til 0 ved session-start og så gemmes i hver form. Når formen submittes kan man tjekke de to tal op imod hinanden. Hvis alt er ok, tælles værdien op (dermed gør "gamle" form-data'en ugyldig for evt efterfølgende submits). Ideen er jo den samme. Man gør data ugyldigt når data er gemt.
Men der er stadig race-conditions. Og en række faktorer i koden der kan give problemer.
Men jeg kan da lave en side, så er du velkommen til at submitte løs :-)
Der er jo også en anden væsenlig forskel. "Mit" forslag går på hvordan man kan håndtere problemet når det sker. Header() håndterer ikke problemet, men undgår det. Hvis der resubmittes før header() bliver udført af browseren, så har vi samme programstilling. Det er bare minimeret hvor tit det sker - og med meget lidt kode.
(olebole, jeg ved godt at du sandsynligvis ved det meste af dette, men det er ligeså meget skrevet til andre der måtte læse dette senere - selvom de færreste søger efter svar :( )
Synes godt om
Ny brugerNybegynder
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.