Ako zakázať opätovné odoslanie formulára. Pri obnovení stránky znova odošlite údaje formulára. Zabránenie opätovnému odoslaniu formulára pomocou presmerovania na strane klienta
Kedysi som bol zmätený otázkou - ako chrániť stránky webu pred opätovným odoslaním údajov z formulára počas obnovy stránky (samozrejme, ak predtým došlo k odosielaniu).
Každý webmaster a vývojár pravdepodobne vie, že ak ste klikli na tlačidlo „odoslať“ na stránke vyplnením akéhokoľvek formulára, tak po odoslaní, ak sa pokúsite stránku obnoviť, prehliadač zobrazí správu potvrdzujúcu opätovné odoslanie.
V niektorých bodoch je to neprijateľné. Napríklad v prípade elementárnej formy spätná väzba. Keď používateľ vyplnil formulár a odoslal správu a potom z nejakého známeho dôvodu obnovil stránku, list opäť zmizol. Toto samozrejme nemusí byť až taký fatálny prípad, len ako príklad. Všetko je oveľa bolestivejšie napríklad pri odosielaní objednávky v internetovom obchode.
Položil som si teda otázku, ako nájsť riešenie tohto problému, a uvedomil som si, že existuje len jedno riešenie: použitie presmerovania po odoslaní hlavičky formulára („umiestnenie: adresa“). Tie. všetko je jednoduché - po odoslaní zavoláme presmerovanie (môžete aj na rovnakú stránku) a je to! Obnovenie stránky bude čisté, bez dokončených POST a GET.
Všetko by bolo v poriadku, ale osobne som s tým mal nejaké problémy. Sú nasledovné. Predtým, bez použitia presmerovaní, mechanizmus odosielania údajov na mojich stránkach fungoval takto:
Používateľ vyplní formulár, stlačí „odoslať“, skript prijme odoslané údaje, skontroluje ich správnosť (platnosť, požadované údaje atď.) a vydá odpoveď – buď operácia prebehla úspešne, alebo sa vyskytla chyba a zobrazí sa zoznam chýb (napríklad: chyba - pole „meno“ nie je vyplnené. A na stránke odosielania sa zase zobrazí zodpovedajúca správa: odoslanie bolo úspešné alebo nebolo úspešné.
Ak odoslanie nie je úspešné, formulár zostane na obrazovke a jeho polia sa vyplnia údajmi, ktoré používateľ zadal. Tie. údaje sú prevzaté z premennej $_POST (ak metóda POST) a zadajte príslušné polia (t. j. vrátia sa z príspevku do svojich polí, aby ich znova nezadávali). Každého totiž nahnevá, keď ste formulár vyplnili a nedajbože ste niečo nesprávne označili a pri pokuse o odoslanie dostanete správu, že niečo je vyplnené nesprávne a formulár je opäť aktualizovaný a prázdny. A kvôli jednému nesprávne vyplnenému políčku ho musíte vyplniť znova.
Takže, ako už bolo povedané, v prípade neúspešného vyplnenia formulár zostáva vyplnený údajmi prevzatými z $_POST a používateľ môže opraviť nesprávne údaje a odoslať formulár znova.
Všetko bolo dobré a všetko fungovalo.
Potom som ale urobil odoslanie pomocou presmerovania a ukázalo sa, že po kliknutí na tlačidlo "odoslať" sa v prípade neúspešného vyplnenia formulár aktualizoval a vyplnené polia v ňom už nemohli zostať, pretože. predtým boli vyplnené automaticky z poľa $_POST a teraz, po vykonaní presmerovania, sa $_POST vyčistilo, ako keby nedošlo k žiadnemu odosielaniu.
Ale v tomto prípade existovalo východisko. Použite relácie. Tie. pred volaním hlavičky preneste dáta z POST do premenných relácie a až potom s nimi po presmerovaní operujte.
V dôsledku toho sa kód stal oveľa komplikovanejším. Ladenie sa stalo zložitejším, pretože vo všeobecnosti je ťažké určiť, čo sa stane s funkciami, keď dôjde k presmerovaniu. Ak ste urobili nejakú chybu v kódoch (ktorá sa zobrazuje presne v čase odoslania), tak sa to ani nezobrazí, pretože. dôjde k presmerovaniu a neuvidíte ani chybové hlásenie.
Vo všeobecnosti, po implementácii hlavičky do mojich kódov sa pre mňa sťažilo pracovať s mojimi aplikáciami. Vývoj / revízia / hľadanie chýb sa skomplikovalo. Ale ani to nemôžem odmietnuť.
A stále sa pýtam: existujú aj iné, elegantnejšie riešenia?
Proces odosielania HTML formuláre môže trvať niekoľko sekúnd, kým sa formulár úspešne odošle a zobrazí sa stránka s odpoveďou. Používatelia, ktorí nie sú dostatočne trpezliví, môžu kliknúť na tlačidlo Odoslať viackrát, čo spôsobí opätovné odoslanie formulára. Zvyčajne to nie je problém, ale v niektorých prípadoch tomu môžete zabrániť.
Nižšie nájdete dva jednoduché triky, ako zabrániť dvojitému odosielaniu, môžete použiť ktorýkoľvek z nich alebo ich kombináciu.
Zabránenie viacnásobnému odoslaniu pomocou JavaScriptu
Pravdepodobne najviac používa Javascript na zabránenie opätovnému odoslaniu formulára jednoduchý spôsob. Keď používateľ odošle formulár, môžete vypnúť tlačidlo "Odoslať" a zmeniť jeho názov na niečo popisnejšie "Odosielam, čakajte prosím..."
Prvým krokom je nastavenie jedinečného identifikátora id, napríklad id="myButton":
Druhým (a posledným) krokom je nastavenie dvoch Javascriptových príkazov v tagu