Script többszöri futásának elkerülése
Sziasztok
Elôre is bocs a lúzer kérdésekért.
Szóval van egy gomb a weboldalon és ha többször egymás után rákattintok akkor a hozzárendelt script többször is lefut. Kérdés , hogy lehet elkerülni az ilyen baleseteket?
A script adatbázist használ és elôfordul párszor hogy belassul az egész oldal, és ilyenkor a user türelmetlen és csak kattintgat.
A folyamat tranzakcióként megy tehát ha valami gond történik akkor rollback-el az egész. Most úgy van megoldva, hogy a tranzakció elôtt egy flaget 1-re állítok, majd amikor lefutott a script akkor 0-ra írom. És amíg 1 a flag értéke addig nem tud a script fô része újra futni. Az még hozzátartozik a dologhoz, hogy a tranzakció végén egy másik paraméter szinén olyan értéket kap, ami már nem engedi újra lefutni a scriptet, azonban ezt a paramétert csak a tranzakció végén változtathatom meg.
Na most ez vajon jó megoldás vagy sem?
És még egy kérdés:
Mi történik olyankor ha egy user sokszor egymás után kattint egy gombra? A script annyiszor le fog futni teljesen ahányszor rákattintottak, vagy az elsô futás félbeszakad mikor a második gombnyomás érkezik?
köszönöm
■ Elôre is bocs a lúzer kérdésekért.
Szóval van egy gomb a weboldalon és ha többször egymás után rákattintok akkor a hozzárendelt script többször is lefut. Kérdés , hogy lehet elkerülni az ilyen baleseteket?
A script adatbázist használ és elôfordul párszor hogy belassul az egész oldal, és ilyenkor a user türelmetlen és csak kattintgat.
A folyamat tranzakcióként megy tehát ha valami gond történik akkor rollback-el az egész. Most úgy van megoldva, hogy a tranzakció elôtt egy flaget 1-re állítok, majd amikor lefutott a script akkor 0-ra írom. És amíg 1 a flag értéke addig nem tud a script fô része újra futni. Az még hozzátartozik a dologhoz, hogy a tranzakció végén egy másik paraméter szinén olyan értéket kap, ami már nem engedi újra lefutni a scriptet, azonban ezt a paramétert csak a tranzakció végén változtathatom meg.
Na most ez vajon jó megoldás vagy sem?
És még egy kérdés:
Mi történik olyankor ha egy user sokszor egymás után kattint egy gombra? A script annyiszor le fog futni teljesen ahányszor rákattintottak, vagy az elsô futás félbeszakad mikor a második gombnyomás érkezik?
köszönöm
Disabled
refresh ellenőrzés
Ha adat hozzáadásról van szó (pl. hozzászólás beküldés), akkor érdemes megnézni az adatbázisban az utoljára rögzített sort. Ha ez megegyezik az aktuális beküldéssel, akkor az újat el lehet dobni, mert ismételt beküldés.
Lehet egy véletlen-generált számot beépíteni az űrlapba egy hidden mezőbe. Ezt a feldolgozás elején beírhatod az adatbázisodba, mint utolsó művelet flag - ha ilyen számmal érkezik új feldolgozási kérés, az el lehet dobni.
Segíthet, ha az eredmény oldalt header() -el átdobod egy másik url-re. Ezzel legalábbis megszabadulsz a POST változóktól.
A 2. kérdésedre: tudtommal minden oldalkérés egy új feldolgozást indít a szerveren/php-ban. Tehát igen, előfordulhat, hogy az előző feldolgozás még nem fejeződött be, és már kezdené az újat.
Hirtelen ennyi jut eszembe...
Még annyit, hogy
Az "utoljára rögzített adat" ellenőrzése azért nem célszerű, mert egy forgalmas oldal esetében nagyon erőforrásigényes lehet, és előidézi azt, amit próbálsz elkerülni: lassú lesz a submit. (továbbá bonyolult feltételeket kell beépítened az ellenőrzésre, ami előbb-utóbb el fog bukni).
Hidden mezőben véletlen szöveg: javasolt, esetleg egy userid+timestamp string md5 algoritmussal való elkódolása jó ötlet lehet. Ugyanakkor ennek kezelését semmiképpen ne az adattáblára bízd, mert pont a gyors reagálást fogja akadályozni, ha már több ezer adatbejegyzésed van. Ehelyett használj temp táblát/memória táblát, gyakran ürítsd (truncate-tel és ne delete from-mal), indexeld, stb.
header() megoldás: remek, de ettől még a posztolási műveletet többször el lehet sütni, megintcsak elbotlasz.
Thom pedig jól tudja, ahány poszt, annyiszor kezdődik el a php script, a különbség annyi, hogy csak az utolsó submit eredménye megy vissza a kliens brózerébe, a többi a php script futása végén megy a levesbe.
Legjobb amúgy, ha több módszert kombináltan használsz.
disable-button - enter - tabindex
Szerintem minden böngésző elküldi az űrlapot enterre is... ha az utolsó mezőben állunk az enter megnyomásakor. A mezők sorrendje a kódbeli sorrendet jelenti, ami a tabindex használatával módosítható.
Ezenkívül az űrlap elküldése nem a submit megnyomásakor, hanem annak felengedésekor történik. Tehát, ha ráfekszem a gombra, nem történik semmi, amíg azt fel nem engedem. (javítson ki valaki, ha tévednék)
Az "utoljára rögzített adat" ellenőrzése egy plusz sorlekérdezést jelent. Alkalmazás függő, hogy ez mennyire erőforrás-igényes. Nem tudjuk, hogy a kérdező milyen adatokat akar kezelni, tehát lehet, hogy ez a módszer neki nem is jó.
A hidden mező+random érték ellenőrzést én arra használom, hogy csak a saját oldalról fogadjon el űrlapküldést, más, külső forrásból nem. (Az űrlap generálásakor random számot generálok, sessionba és egy űrlap hidden mezőbe teszem. Feldolgozáskor megnézem, a session érték egyezik-e az űrlapban küldöttel. Ha igen, akkor biztos a saját oldalam űrlapjából küldték, ha nem, akkor eldobom az űrlapot)
Jelen esetben azért javasoltam adattáblába írni, mert szvsz. így biztosítható, hogy egy elküldött űrlapot csak egyszer írjunk be a táblába.
A módszerek kombinálása, esetleg saját magad által kitalált (és letesztelt) egyéni módszerek használata mindenképpen védettebbé teheti az alkalmazásodat.
onSubmit
script eredmény
Mindenkinek köszönöm a tanácsát. Megpróbálok valamit összehozni
Biztos hogy csak az utolsó submit eredménye megy vissza a böngészôbe? Mert én úgy tapasztaltam, hogy nem. Tfh a böngészô a gomb megnyomása után egy szöveget tesz be egy adatbázis táblába, majd a visszetérô oldalon a beszúrt szöveg megjelenik. Na most ha nem minden script eredménye jut vissza a böngészôbe, akkor miért fordulhat elô az, hogy többször egymás után kiíródik a szöveg, ha az oldal belassul és a user sokszor nyomkod?