ugrás a tartalomhoz

Script többszöri futásának elkerülése

blabla · 2009. Jan. 15. (Cs), 13.27
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
 
1

Disabled

Poetro · 2009. Jan. 15. (Cs), 13.38
Azt is megteheted, hogy JavaScript-tel a gombot disabled-re váltod, és akkor nem lehet újra megnyomni. Ez az ideges felhasználókat kicsit lehiggasztja, és látszik hogy korábban már megnyomta. Persze szerver oldalon is mindenképpen kezelni kell.
2

refresh ellenőrzés

Thom · 2009. Jan. 15. (Cs), 22.14
Nem tudom, milyen műveletet hajtasz végre és ennek mennyi a futási ideje - lehet, hogy a szokottnál hosszabb, azért "türelmetlenkedik" a látogató. Ha ez normálisan is hosszabb ideig tart, nem árt ezt kiírni, hogy tudja, mire számíthat.

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...
3

Még annyit, hogy

deejayy · 2009. Jan. 16. (P), 11.59
Ha a disable button megoldást választod, gondolj arra is, hogy pl. Operában egy egyszerű enter nyomással is submitolható egy form. Ugyanitt érdemes letesztelni, hogy mi történik, ha userke rátehénkedik az enterre.

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.
4

disable-button - enter - tabindex

Thom · 2009. Jan. 16. (P), 15.18
Disable button - enter-hez:
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.
5

onSubmit

gex · 2009. Jan. 16. (P), 15.43
hát igen, egy űrlapot elég sokféleképpen el lehet küldeni, a legegyszerűbb megoldás - ezen a vonalon haladva - ha az első submit esemény bekövetkeztekor ráakaszkodunk az onSubmit eseményre és úgy gátoljuk meg a többszöri elküldést.
6

script eredmény

blabla · 2009. Jan. 19. (H), 12.23
Hello

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?