Kontakty

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

. Prvý príkaz deaktivuje tlačidlo odoslania po odoslaní formulára a druhý zmení text tlačidla, aby mal používateľ predstavu o tom, čo sa deje. Do značky je potrebné pridať nasledujúci kód :

Značka formulára bude vyzerať takto:

onsubmit="document.getElementById('myButton').disabled=true;

document.getElementById('myButton').value='Odosiela sa, čakajte prosím..';"

A po stlačení tlačidla sa zmení na toto

To je všetko. Tento trik by mal fungovať vo väčšine prehliadačov (IE 5+, FireFox, Opera, Chrome).

Zabránenie viacnásobnému odoslaniu pomocou súborov cookie

Ak sa chcete vyhnúť opätovnému odosielaniu formulárov počas trvania relácie vášho prehliadača (alebo dlhšie), možno budete chcieť zvážiť používanie súborov cookie. Napríklad upravte skript na úpravu formulára tak, aby odovzdal súbor cookie prehliadaču po spracovaní formulára, ale pred odoslaním hlavičiek HTML. Umiestnenie tohto kódu za príkaz mail() by malo fungovať vo väčšine prípadov:

setcookie('FormSubmitted', '1');

Potom súbor cookie pred spracovaním skontrolujte. Ak sú už vytvorené, používateľ už odoslal formulár v aktívnej relácii prehliadača. Na začiatok skriptu na spracovanie formulára pridajte nasledujúci kód.


{
die('Formulár môžete odoslať iba raz za reláciu!');
}

To je všetko.

Takto by vyzerala konečná verzia skriptu s použitím súborov cookie na blokovanie opätovného odoslania. Všimnite si, že časť kódu bola pridaná na začiatok skriptu a kód na písanie súboru cookie je za funkciou mail().

/* Zabrániť opätovnému odoslaniu */

if (isset($_COOKIE[‘FormSubmitted’])
{
show_error('Formulár môžete odoslať iba raz za reláciu!');
}

/* Nastaviť príjemcu e-mailu */

$mymail = " [e-mail chránený]»;

/* Kontrola hodnôt zadaných vo formulári pomocou funkcie check_input */

$vaše meno = check_input($_POST['vaše meno'], "Zadajte svoje meno");
$predmet = check_input($_POST['predmet'], "Predmet príspevku");
$email = check_input($_POST['e-mail']);
$website = check_input($_POST['webove stranky']);
$likeit = check_input($_POST['likeit']);
$how_find = check_input($_POST['ako']);
$comments = check_input($_POST['komentáre'], "Vaše komentáre");

/* Ak je zadaná neplatná e-mailová adresa, zobrazí sa chybové hlásenie */
if (!preg_match("/( [e-mail chránený]+.+)/", $email))
{
show_error("Zadali ste nesprávny e-mail");
}

/* Ak je adresa URL neplatná, nastavte premennú $website na prázdnu */
if (!preg_match("/^(https?://++.+)/i", $website))
{
$webová stránka = ";
}

/* Pripraviť e-mailovú správu */

$message = "Dobrý deň!
Vaše kontaktné údaje boli odoslané na adresu:
Meno: $vaše meno
E-mail: $email
URL: $website
Páči sa vám web? $likeit
Ako ste našli webovú stránku? $how_find

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árneho formulára spätnej väzby. 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 sa prevezmú z premennej $_POST (ak je metóda POST) a umiestnia sa do príslušných polí (t. j. vrátia sa z príspevku do svojich polí, aby sa do nich znova nezadali). 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?



Páčil sa vám článok? Zdieľaj to