Kapcsolatok

Az űrlap újraküldésének letiltása. Az oldalfrissítésnél küldje el újra az űrlapadatokat. Űrlapok újraküldésének megakadályozása ügyféloldali átirányítással

Egy időben elgondolkodtatott a kérdés - hogyan lehet megvédeni az oldal oldalait az űrlapadatok újraküldésétől az oldalfrissítés során (persze, ha előtte volt küldés).
Valószínűleg minden webmester és fejlesztő tudja, hogy ha az oldalon bármilyen űrlap kitöltésével a „küldés” gombra kattintott, akkor a beküldés után, ha megpróbálja frissíteni az oldalt, a böngésző egy üzenetet jelenít meg, amely megerősíti az újraküldést.
Ez bizonyos pontokon elfogadhatatlan. Például az elemi alak esetében Visszacsatolás. Amikor a felhasználó kitöltötte az űrlapot és elküldte az üzenetet, majd valamilyen általa ismert okból frissítette az oldalt, a levél ismét eltűnt. Ez persze nem lehet végzetes eset, csak példaként. Minden sokkal fájdalmasabb, például egy webáruházban történő rendelés feladásakor.
Feltettem tehát magamnak a kérdést, hogy találjak-e megoldást erre a problémára, és rájöttem, hogy egyetlen megoldás létezik: az űrlapfejléc ('helyszín: cím') elküldése után átirányítást kell használni. Azok. minden egyszerű - küldés után hívunk egy átirányítást (akár ugyanarra az oldalra is) és kész! Az oldal frissítése tiszta lesz, befejezett POST-ok és GET-ek nélkül.

Minden rendben lenne, de személyesen tapasztaltam néhány problémát ezzel kapcsolatban. Ezek a következők. Korábban az átirányítások használata nélkül a webhelyeim adatküldésének mechanizmusa a következőképpen működött:
A felhasználó kitölti az űrlapot, rákattint a "küldés" gombra, a szkript megkapja a beküldött adatokat, ellenőrzi azok helyességét (érvényesség, kötelező adatok stb.) és választ ad - vagy sikeres volt a művelet, vagy hiba történt és egy lista hibák (például: hiba - a „név” mező nincs kitöltve. A küldő oldalon pedig egy megfelelő üzenet jelenik meg: a küldés sikeres vagy nem sikerült.
Ha a beküldés sikertelen, az űrlap a képernyőn marad, és a mezői feltöltődnek a felhasználó által megadott adatokkal. Azok. az adatok a $_POST változóból származnak (ha POST módszer), és írja be a megfelelő mezőket (azaz a posztból visszatérnek a saját mezőibe, hogy ne írják be újra). Hiszen mindenkit feldühít, amikor kitöltötted az űrlapot, és ne adj isten valamit rosszul jeleztél, és amikor megpróbálod elküldeni, akkor kapsz egy üzenetet, hogy valami rosszul van kitöltve, és az űrlap frissül és újra üres. És egy hibásan kitöltött mező miatt újra ki kell töltenie.
Így, mint már említettük, sikertelen kitöltés esetén az űrlap feltöltve marad a $_POST-ból vett adatokkal, és a felhasználó javíthatja a hibás adatokat és újra elküldheti az űrlapot.
Minden jó volt és minden működött.
De aztán csináltam egy küldést átirányítással, és kiderült, hogy a "küldés" gombra kattintás után sikertelen kitöltés esetén az űrlap frissült és a kitöltött mezők már nem maradhattak benne, mert. korábban automatikusan kitöltötték a $_POST tömbből, most pedig az átirányítás után a $_POST úgy lett megtisztítva, mintha nem is lett volna küldés.
De ebben az esetben volt kiút. Használjon munkameneteket. Azok. a fejléc hívása előtt vigye át az adatokat a POST-ból a session változókhoz, és csak ezután, átirányítás után, működjön velük.
Ennek eredményeként a kód sokkal bonyolultabb lett. A hibakeresés nehezebbé vált, mert általában nehéz meghatározni, hogy mi történik a függvényekkel, amikor átirányítás történik. Ha valami hibát vétett a kódokban (ami pontosan a küldéskor jelenik meg), akkor az nem is jelenik meg, mert. átirányítás történik, és még hibaüzenetet sem fog látni.
Általánosságban elmondható, hogy miután implementáltam a fejlécet a kódjaimba, nehezebbé vált az alkalmazásaimmal való munka. A fejlesztés / átdolgozás / hibakeresés bonyolultabbá vált. De én sem tagadhatom meg.
És folyton azon töprengek: vannak más, elegánsabb megoldások?

Küldési folyamat HTML űrlapok eltarthat néhány másodpercig, amíg az űrlap sikeresen elküldésre kerül, és megjelenik a válaszoldal. Azok a felhasználók, akik nem elég türelmesek, többször is rákattinthatnak a Küldés gombra, így az űrlap újra elküldésre kerül. Általában ez nem jelent problémát, de bizonyos esetekben megakadályozhatja, hogy ez megtörténjen.
Az alábbiakban két egyszerű trükköt találsz a dupla feladás elkerülésére, ezek bármelyikét, vagy ezek kombinációját is használhatod.

Többszörös beküldés megakadályozása Javascript segítségével

Valószínűleg a Javascript használata az űrlapok újraküldésének megakadályozására a legjobb a könnyű út. Amikor a felhasználó elküldi az űrlapot, kikapcsolhatja a „Küldés” gombot, és módosíthatja a nevét valami leíróbb „Küldés, kérem várjon...”-ra.

Az első lépés egy egyedi azonosító beállítása id, például id="myButton":

A második (és utolsó) lépésben két Javascript-parancsot kell beállítani a címkében

. Az első parancs letiltja a küldés gombot az űrlap elküldése után, a második pedig megváltoztatja a gomb szövegét, hogy a felhasználó képet kapjon arról, hogy mi történik. A következő kódot kell hozzáadni a címkéhez :

Az űrlapcímke így fog kinézni:

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

document.getElementById('myButton').value='Küldés folyamatban, kérem várjon...';"

És a gomb megnyomása után ilyenné válik

Ez minden. Ennek a trükknek a legtöbb böngészőn működnie kell (IE 5+, FireFox, Opera, Chrome).

Többszöri beküldés megelőzése cookie-k használatával

Ha el szeretné kerülni az űrlapok újbóli beküldését a böngésző munkamenete idejére (vagy hosszabb ideig), fontolja meg a cookie-k használatát. Például módosítsa az űrlapszerkesztő szkriptjét, hogy a cookie az űrlap feldolgozása után, de a HTML-fejlécek elküldése előtt kerüljön át a böngészőbe. Ha ezt a kódot a mail() parancs után helyezzük el, akkor a legtöbb esetben működnie kell:

setcookie('FormSubmitted', '1');

Ezután feldolgozás előtt ellenőrizze a cookie-t. Ha már létrejöttek, akkor a felhasználó már elküldte az űrlapot az aktív böngésző munkamenetben. Adja hozzá a következő kódot az űrlapfeldolgozási szkript elejéhez.


{
die('Az űrlapot munkamenetenként csak egyszer küldheti el!');
}

Ez minden.

Így nézne ki a szkript végső verziója, amely cookie-kat használ az újraküldések blokkolására. Figyeljük meg, hogy a kód egy része a szkript tetejére került, és a cookie írásának kódja a mail() függvény után található.

/* Az újraküldés megakadályozása */

if (isset($_COOKIE['FormSubmitted'])
{
show_error('Az űrlapot munkamenetenként csak egyszer küldheti el!');
}

/* E-mail címzett beállítása */

$mymail = " [e-mail védett]»;

/* Az űrlapon megadott értékek ellenőrzése a check_input függvény segítségével */

$sajátnév = check_input($_POST['sajátnév'], "Adja meg a nevét");
$tárgy = check_input($_POST['tárgy'], "Tárgy közzététele");
$email = check_input($_POST['email']);
$webhely = check_input($_POST['webhely']);
$likeit = check_input($_POST['likeit']);
$how_find = check_input($_POST['hogyan']);
$comments = check_input($_POST['megjegyzések'], "Az Ön megjegyzései");

/* Ha érvénytelen e-mail címet ad meg, hibaüzenet jelenik meg */
if (!preg_match("/( [e-mail védett]+.+)/", $email))
{
show_error("Rossz e-mail címet adott meg");
}

/* Ha az URL érvénytelen, állítsa üresre a $website változót */
if (!preg_match("/^(https?://++.+)/i", $webhely))
{
$webhely = ";
}

/* Készítsen e-mail üzenetet */

$message = "Szia!
Elküldtük elérhetőségeit a következő címre:
Név: $a neved
E-mail: $email
URL: $webhely
Tetszik a weboldal? $tetszik
Hogyan találtad meg a weboldalt? $how_find

Egy időben elgondolkodtatott a kérdés - hogyan lehet megvédeni az oldal oldalait az űrlapadatok újraküldésétől az oldalfrissítés során (persze, ha előtte volt küldés).
Valószínűleg minden webmester és fejlesztő tudja, hogy ha az oldalon bármilyen űrlap kitöltésével a „küldés” gombra kattintott, akkor a beküldés után, ha megpróbálja frissíteni az oldalt, a böngésző egy üzenetet jelenít meg, amely megerősíti az újraküldést.
Ez bizonyos pontokon elfogadhatatlan. Például egy elemi visszajelzési űrlap esetén. Amikor a felhasználó kitöltötte az űrlapot és elküldte az üzenetet, majd valamilyen általa ismert okból frissítette az oldalt, a levél ismét eltűnt. Ez persze nem lehet végzetes eset, csak példaként. Minden sokkal fájdalmasabb, például egy webáruházban történő rendelés feladásakor.
Feltettem tehát magamnak a kérdést, hogy találjak-e megoldást erre a problémára, és rájöttem, hogy egyetlen megoldás létezik: az űrlapfejléc ('helyszín: cím') elküldése után átirányítást kell használni. Azok. minden egyszerű - küldés után hívunk egy átirányítást (akár ugyanarra az oldalra is) és kész! Az oldal frissítése tiszta lesz, befejezett POST-ok és GET-ek nélkül.

Minden rendben lenne, de személyesen tapasztaltam néhány problémát ezzel kapcsolatban. Ezek a következők. Korábban az átirányítások használata nélkül a webhelyeim adatküldésének mechanizmusa a következőképpen működött:
A felhasználó kitölti az űrlapot, rákattint a "küldés" gombra, a szkript megkapja a beküldött adatokat, ellenőrzi azok helyességét (érvényesség, kötelező adatok stb.) és választ ad - vagy sikeres volt a művelet, vagy hiba történt és egy lista hibák (például: hiba - a „név” mező nincs kitöltve. A küldő oldalon pedig egy megfelelő üzenet jelenik meg: a küldés sikeres vagy nem sikerült.
Ha a beküldés sikertelen, az űrlap a képernyőn marad, és a mezői feltöltődnek a felhasználó által megadott adatokkal. Azok. az adatokat a $_POST változóból veszik (ha a metódus POST), és a megfelelő mezőkbe helyezik (azaz a postból visszakerülnek a saját mezőibe, hogy ne írják be újra). Hiszen mindenkit feldühít, amikor kitöltötted az űrlapot, és ne adj isten valamit rosszul jeleztél, és amikor megpróbálod elküldeni, akkor kapsz egy üzenetet, hogy valami rosszul van kitöltve, és az űrlap frissül és újra üres. És egy hibásan kitöltött mező miatt újra ki kell töltenie.
Így, mint már említettük, sikertelen kitöltés esetén az űrlap feltöltve marad a $_POST-ból vett adatokkal, és a felhasználó javíthatja a hibás adatokat és újra elküldheti az űrlapot.
Minden jó volt és minden működött.
De aztán csináltam egy küldést átirányítással, és kiderült, hogy a "küldés" gombra kattintás után sikertelen kitöltés esetén az űrlap frissült és a kitöltött mezők már nem maradhattak benne, mert. korábban automatikusan kitöltötték a $_POST tömbből, most pedig az átirányítás után a $_POST úgy lett megtisztítva, mintha nem is lett volna küldés.
De ebben az esetben volt kiút. Használjon munkameneteket. Azok. a fejléc hívása előtt vigye át az adatokat a POST-ból a session változókhoz, és csak ezután, átirányítás után, működjön velük.
Ennek eredményeként a kód sokkal bonyolultabb lett. A hibakeresés nehezebbé vált, mert általában nehéz meghatározni, hogy mi történik a függvényekkel, amikor átirányítás történik. Ha valami hibát vétett a kódokban (ami pontosan a küldéskor jelenik meg), akkor az nem is jelenik meg, mert. átirányítás történik, és még hibaüzenetet sem fog látni.
Általánosságban elmondható, hogy miután implementáltam a fejlécet a kódjaimba, nehezebbé vált az alkalmazásaimmal való munka. A fejlesztés / átdolgozás / hibakeresés bonyolultabbá vált. De én sem tagadhatom meg.
És folyton azon töprengek: vannak más, elegánsabb megoldások?



Tetszett a cikk? Oszd meg