Guten Abend,
wie loest ihr das Problem, das jemand eine Seite zweimal hintereinander laed, was somit zu fehlern fuehren kann: z.B. Forschung die normalerweise nur einmal erforscht werden darf, landet zweimal in der Warteschlange u.a.
Ich habe mir ueberlegt so eine Art Ticket fuer jede Aktion zu erstellen, das dann nach der Aktion um eins erhoeht wird und beim Neuladen nur die Seite laed ohne irgendwelche weiteren Sachen zu machen. Allerdings waere dabei ja dann das Problem, das man das ganze nicht in mehreren Browserfenstern gleichzeitig geoeffnet haben kann, was ich wiederrum recht nervig finde, weil ich gerne in einem Fenster eine Karte habe, in einem anderen eine Bauuebersicht und in einem weiteren z.B. eine Flottenuebersicht...
wie loest ihr die Problematik?
Probleme durch mehrfaches laden einer Seite
gepostet vor 19 Jahre, 11 Monate von sammy
gepostet vor 19 Jahre, 11 Monate von Qmaster
Ich entwickle unter JAVA, aber das lässt sich ohne weiteres auf PHP übertragen.
Ich halte im Benutzer-Objekt eine boolsche Variable die beim Eintritt in eine Aktionsausführung(z.B Klick auf bauen) umgeschaltet wird. Solange die Aktion ausgeführt wird(Voraussetzungen prüfen, Rohstoffe abziehen usw) kann keine andere Aktions ausgeführt werden. Beim verlassen wird wieder freigeschaltet.
Somit ist jede Aktion sicher. Erst wenn alles erledigt wird kann eine weitere Aktion ausgeführt werden.
Ich halte im Benutzer-Objekt eine boolsche Variable die beim Eintritt in eine Aktionsausführung(z.B Klick auf bauen) umgeschaltet wird. Solange die Aktion ausgeführt wird(Voraussetzungen prüfen, Rohstoffe abziehen usw) kann keine andere Aktions ausgeführt werden. Beim verlassen wird wieder freigeschaltet.
Somit ist jede Aktion sicher. Erst wenn alles erledigt wird kann eine weitere Aktion ausgeführt werden.
gepostet vor 19 Jahre, 11 Monate von sammy
Okay, das waere eine Loesung fuer ein Problem was ich bis jetzt noch gar nicht bedacht hatte, wenn in mehreren Fenstern gleichzeitig etwas gebaut wird.
Mein Problem war jetzt allerdings auch wenn ich nur ein Fenster habe, und etwas baue und das Fenster dann einfach nochmal genauso lade, dann kann es Probleme geben, weil es eine Queue fuer Auftraege jeglicher Art gibt und ich es verhindern will, das etwas durch aktualisieren der Seite doppelt eingetragen wird. Wird die gleiche Bauoption z:b. ein zweites mal gewählt, ohne das die Seite per Browser-Aktualisierungsbutton neu geladen wird, soll das ganze ja wie gewohnt in die Queue gehen, nur habe ich dafuer zur Zeit keine Unterscheidungsmoeglichkeit.
Mein Problem war jetzt allerdings auch wenn ich nur ein Fenster habe, und etwas baue und das Fenster dann einfach nochmal genauso lade, dann kann es Probleme geben, weil es eine Queue fuer Auftraege jeglicher Art gibt und ich es verhindern will, das etwas durch aktualisieren der Seite doppelt eingetragen wird. Wird die gleiche Bauoption z:b. ein zweites mal gewählt, ohne das die Seite per Browser-Aktualisierungsbutton neu geladen wird, soll das ganze ja wie gewohnt in die Queue gehen, nur habe ich dafuer zur Zeit keine Unterscheidungsmoeglichkeit.
gepostet vor 19 Jahre, 11 Monate von Qmaster
Du musst nach dem ausführen der Aktion auf eine "sauber" Seite umleiten. In PHP muss es doch sowas wie serverseitigen redirect geben.
Der User schickt z.B eine Anfrage an Seite xxxxxxx.php?aktion=1
Aktion verarbeiten und dem User als Antwort die Seite xxxxxxx.php ausgeben ohne die Aktion.
Unter JAVA ist sowas mit einer Zeile gemacht. Es gibt ein response Objekt. Da sage ich einfach response.sendRedirect("xxxxx.php") und der User bekommt eine reine Seite angezeigt als ob er nie etwas gedrückt hätte.
Der User schickt z.B eine Anfrage an Seite xxxxxxx.php?aktion=1
Aktion verarbeiten und dem User als Antwort die Seite xxxxxxx.php ausgeben ohne die Aktion.
Unter JAVA ist sowas mit einer Zeile gemacht. Es gibt ein response Objekt. Da sage ich einfach response.sendRedirect("xxxxx.php") und der User bekommt eine reine Seite angezeigt als ob er nie etwas gedrückt hätte.
gepostet vor 19 Jahre, 11 Monate von TimeOut
a) Die Sache mit dem Ticket erhöht zugleich auch noch die Session-Sicherheit. Ist unbedingt zu empfehlen, da sonst "Session Riding" Angriffe möglich wären. Der Nachteil mit dem zweiten Fenster ist dabei ein kleines Manko, allerdings sollte man dann vielleicht einfach mal die Benutzerführung überdenken.
b) Redirect kannst du gut mit dem Header-Befehl in PHP machen. Wichtig sind dabei folgende Punkte: 1. Es muss eine absolute URL sein, also mit http:// beginnen, sowie 2. Es darf vorher absolut kein HTTP-Output gesendet werden. Selbst ein einzelnes Leerzeichen vor dem Befehl:
exit;
b) Redirect kannst du gut mit dem Header-Befehl in PHP machen. Wichtig sind dabei folgende Punkte: 1. Es muss eine absolute URL sein, also mit http:// beginnen, sowie 2. Es darf vorher absolut kein HTTP-Output gesendet werden. Selbst ein einzelnes Leerzeichen vor dem Befehl:
header("Location: http://www.galaxy-news.de");
exit;
gepostet vor 19 Jahre, 11 Monate von barkel
ich verstehd as problem nicht,...mach das mit dme wert , das ist am besten....quasi 0 für "Forschungsauftrag ausführbar" und 1 für "nicht ausführbar"...
gepostet vor 19 Jahre, 11 Monate von sammy
hm, ich denke, dann werde ich das ganze mit einer Art Ticket realisieren.
gepostet vor 19 Jahre, 11 Monate von Crafty-Catcher
Ich erledige das so:
Wenn es einen Forschungs Auftrag für den entsprechenden User in der DB gibt kann er nicht nochmal forschen.
Funktioniert recht sicher und erfordert nur eine kleine DB abfrage.
Wenn es einen Forschungs Auftrag für den entsprechenden User in der DB gibt kann er nicht nochmal forschen.
Funktioniert recht sicher und erfordert nur eine kleine DB abfrage.
gepostet vor 19 Jahre, 11 Monate von zodiac2k
Es ist eigentlich ganz einfach... man muss, egal auf welche Weise, die Prüfung sowohl für den darstellenden als auch den verarbeitenden Teil durchführen.
Die einfachste Möglichkeit wäre, die Prüfungen in eine Funktion auszulagern, die von der Darstellung als auch der Verarbeitung nur aufgerufen wird, dadurch verhindert man viele Fehler, da man nicht den gleichen codesnippet an x Stellen wiederholen und bei Änderungen mehrere Stellen abgleichen muss.
Die einfachste Möglichkeit wäre, die Prüfungen in eine Funktion auszulagern, die von der Darstellung als auch der Verarbeitung nur aufgerufen wird, dadurch verhindert man viele Fehler, da man nicht den gleichen codesnippet an x Stellen wiederholen und bei Änderungen mehrere Stellen abgleichen muss.
gepostet vor 19 Jahre, 11 Monate von felix
Hab auf einigen Seiten ne Sperre drin, über die Websession. Ziwschen den Seitenaufrufen vergehn so einige Sekunden, ehe man weitergeleitet wird.
gepostet vor 19 Jahre, 11 Monate von sammy
Original von Crafty-Catcher
Ich erledige das so:
Wenn es einen Forschungs Auftrag für den entsprechenden User in der DB gibt kann er nicht nochmal forschen.
Funktioniert recht sicher und erfordert nur eine kleine DB abfrage.
Ja, so aehnlich mache ich das an sich auch, aber bei mir gibt es die Möglichkeit nicht nur eine Sache zu forschen sondern noch gleich eine andere Forschung in Auftrag zu geben, die dann erforscht wird sobald die erste fertig ist.
gepostet vor 19 Jahre, 11 Monate von Crafty-Catcher
Wo ist dann das Problem? Eine Abfrage wie viele Forschungseinträge für User x vorhanden sind und ab 2 sperren.
gepostet vor 19 Jahre, 11 Monate von Bierchen
Oder mehrfaches Forschen einfach erlauben
gepostet vor 19 Jahre, 11 Monate von Grelor Blood
Kann man (bevor die Aktion durchgeführt wird) nicht in der Datenbank nachschauen, ob das eine Gebiet schon erforscht wird bzw. bereits in der Warteschleife ist?
gepostet vor 19 Jahre, 11 Monate von Hadriel
Wenn bei mir jemand die Seite per Aktualisieren/F5 erneut lädt landet er auf einer 'Badnav', d.h. die Seite bleibt wie sie ist und es werden keine aktionen durchgeführt, die eigentlich durchgeführt werden sollten =)
mfg
mfg
gepostet vor 19 Jahre, 11 Monate von sammy
Ich hab jetzt einen Loesungsansatz, mit dem auch mehrfaches oeffnen einer Seite moeglich ist. Mal gucken, muss sie noch programmieren, habe sie nur im Kopf.
gepostet vor 19 Jahre, 9 Monate von OranGe
also ich habe das bei forschungen und gebäuden fast genauso gelöst... mit db halt...
ich hab meine gebäude / forschungs Klasse und die checkt beim aufruf einfach in der DB ob ein process vorhanden ist... wenn ja wird eine boolische variable auf true gesetzt und somit wird eine weitere produktion verhindert und dadurch muss auch nicht für jedes gebäude ein query gemacht werden... nur halt einmal am anfang und wenn due boolische variable true ist, wird halt garnix derartiges zugelassen.
worauf du aber halt unbedingt achten solltest das du im bau-oder-forschungs-script unbedingt eine abfrage machst ob der bau schon in betrieb ist und diese abfrage nicht nur bei der bau-übersicht machst da mal halt sonst einfach "reloaden" könnte und es würde entweder ein fehler kommen oder man könnte mehrere sachen gleichzeitig bauen.
das miter DB Query + Boolische Variable ist in meinen augen das sinnvollste... A) höhere geschwindigkeit B) ziemlich sicherer Schutz
ich hab meine gebäude / forschungs Klasse und die checkt beim aufruf einfach in der DB ob ein process vorhanden ist... wenn ja wird eine boolische variable auf true gesetzt und somit wird eine weitere produktion verhindert und dadurch muss auch nicht für jedes gebäude ein query gemacht werden... nur halt einmal am anfang und wenn due boolische variable true ist, wird halt garnix derartiges zugelassen.
worauf du aber halt unbedingt achten solltest das du im bau-oder-forschungs-script unbedingt eine abfrage machst ob der bau schon in betrieb ist und diese abfrage nicht nur bei der bau-übersicht machst da mal halt sonst einfach "reloaden" könnte und es würde entweder ein fehler kommen oder man könnte mehrere sachen gleichzeitig bauen.
das miter DB Query + Boolische Variable ist in meinen augen das sinnvollste... A) höhere geschwindigkeit B) ziemlich sicherer Schutz