17. november 2003 - 13:44Der er
12 kommentarer og 1 løsning
Slette submittede variabler
Hvis bruger reloader en side (F5) i browseren, bliver en submittet form sendt igen. Dvs. at hvis man har et PHP script, der indsætter variable i en database, vil den gøre det flere gange, og så kommer der jo til at stå det samme i databasen flere gange.
Er der en måde i PHP hvor man kan slette "cachen" fra den submittede form når den er blevet sendt første gang?
Det er bare lidt problematisk, for brugeren bliver sendt til en takkeside der ligger under et punkt der er valgt i en menu. For at komme til dette punkt skal der først submittes menu=5 (f.x.) før man kommer til ovennævnte form.
Ergo skulle jeg skrive noget i stil med header("Location: index.php?menu=5"); og så vil der jo stå en variabel i adresselinjen. Jeg er ikke så glad for variabler i adresselinjen (jeg poster altid mine variabler) - jeg synes de kan være svære at "komme af med igen".
Kan det ikke lade sig gøre helt at slette de postede variabler når jeg har brugt dem?
Jo.. Enten kan du lave en ny POST-formular, hvor du kun medtager de variabler du ønsker at beholde, eller også laver du en GET vha. en location header, hvilket vil "slette" alle POST variabler.
En lille rettelse til mit header forslag, så den ikke kommer med en notice hvis $_SERVER['HTTPS'] ikke er sat: header('Location: http'.(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI');
Hvis du vil acceptere at der kommer den der kedelige "Box" ved tryk på F5, men at data ikke indsættes mere end een gang, kan du bare når brugeren modtager formen tildele den en lang tilfældig streng og så registrere (måske i en ny tabel) når den har været brugt. Anden gang kigger du i tabellen, og hvis den er der, undlader du indsættelsen.
Men ellers er redirect, evt variabler i adresselinie (eller sessionvariable) måden at gøre det på.
Det lyder fornuftigt det du skriver erikjacobsen. Xyborx - jeg er ikke helt sikker på hvad din header kommando gør - er det meningen jeg skal køre den, når jeg har behandlet brugerens data efter at han har postet dem?
Jeps Den header svarer til refresh/F5 uden POST variabler, men bevarer eventuelle GET variabler (dem i url'en). Jeg vil tro der bruges noget i den retning her på eksperten, når man sender en besked.
Det er præcis det der sker her. Selv om URL-en ser lidt pænere ud er det essentielt det samme som .../spm.php?id=428641, og de anvender en redirect efter POST. Kigger man i koden kan man se at action for den <form> man indtaster i går til /respons.php med POST, mens det efterfølgende er .../spm/428641 man ser i URLen
Så er det jo ikke _præcis_ det samme der sker her ;) Det der sker her er nok nærmere: header('Location: '.(isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'http://'.$_SERVER['HTTP_HOST'].'/')); Den redirecter til forrige side, dvs ".../spm.php?id=428641" istedet for ".../respons.php".
Undskyld jeg ikke lige har været på spørgsmålet længe. Brugte en kombination af det I beskrev - deler pointene imellem jer (erikjacobsen læg et svar)... Takker!
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.