Mehrfachausführung verhindern

mihawk

Mitglied
Hallo!
ich hab seit einiger zeit ein gorßes Problem: Auf meiner Seite haben registrierte Benutzer Geld, dass sie gegen Waren eintauschen können, letztere können sie aber auch verkaufen. Wenn man nun beim verkauf ganz schnell ganz oft klickt, wird die Aktion mehrfach ausgeführt, selbst wenn ich eine Abfrage einbaue, die kontrolliert, ob man den Gegenstand überhaupt hat! Das umgekehrte passiert beim Kauf, dann kommt man in den negativen Geldbereich, obwohl eine Abfrage, ob man genug geld hat, eingebaut ist.
Wie kann ich verhindern, dass entweder a) keine doppel- und mehrfachklicks mehr gewertet werden, sondern nur der erste oder dass b) die aktionen nicht doppelt ausgeführt werden
Bitte helft mir, dieser "Bug" raubt mir den letzten Nerv! :(
Danke!:)
 
Eine Möglichkeit wäre vieleicht den Bestätigungsbutton per Javascript nach dem 1.tem klick sperren zu lassen.

Das ist zwar keine php Lösung aber, ist ja auch nur ein Vorschlag
wie ich das machen würde :-)
 
DJ Teac: Hast du dazu gerade eine funktionierende Lösung (sprich: Code) parat? Ich wollte das nämlich mal genauso realisieren, musste dann aber feststellen, dass das nicht funktioniert hat. :(
 
Hola! Rein theoretisch kann ein solches Problem leicht behoben werde! Poste doch mal den Code, wie das Formular abgeschickt, bzw. die Aktion entgegengenommen wird und wie das ganze dann behandelt wird! Eigentlich sollte es so zu lösen sein, dass ein mehrfach klicken bzw. F5 drücken im Browser zu sichern ist!
 
hui, das wärn viele button, aber könntest du mir vielleicht sagen, wie ich den button dann sperren könnte? javascript kann ich nur halbwegs...
 
Wenn, dann würde ich es auch mit PHP machen! Schließlich lässt sich ja, bevor eine Datenbank verändert wird, überprüfen ob es überhaupt legitim ist diese Aktion durchzuführen!

Zumindest eine genauere BEschreibung des Problems könte helfen. z.B. was hat der Benutzer (Geld), was kann er damit machen (kaufen?), wie wird dies gemacht (Formular oder Link?), was geschieht dann in de DB und inwiefern wird die Eingabe zuvopr kontolliert
 
normalerweise löst man sowas, in dem man nachdem die Aktionen im Script ausgeführt wurden eine Weiterleitung einbaut, sprich:

- die geben ihre Sachen im Formular ein, und speichern
- DB Inhalt updaten und was du nun so machen
UND DANN

header('Location: pageSaveDone.php');

- damit man nicht zurück clicken kann, findige User werden die Idee sicher haben auch wenn sie nicht sehen das was passiert, fängt man das entsprechend mit nem Param im REQUEST ab, den du aus dem Forumlar übergibst, und dann bei der Weiterleitung verwirfst, wenn die nun zurück clicken wird die Auswertung nicht wiederholt.

Ich hoffe das ist ein Denkanstoß, sonst gehe ich noch einmal weiter drauf ein.

mfg
Sebastian
 
Eine Lösung mittels JavaScript halte ich für überflüssig!
Das lässt sich ja schliesslich sehr leicht deaktivieren und somit wäre jeder Schutz abhanden!

Mein Vorschlag:
Das PHP-Script, das das Formular erstellt erzeugt eine ID-Nummer die nur einmal gültig ist.
Diese überträgst du dann in einem Hidden-Input-Feld an das Script, das die Formulareingaben auswertet. In diesem Script überprüfst und löscht du dann die im 1. Script erzeugte ID wieder.
Du benötigst dazu allerdings Sessions (oder ein ähnliches System) um die ID auch überprüfen zu können. Da sich deine User aber sowieso anmelden müssen, dürftest du so etwas ja sowieso benutzen. -?!

Beispiel:

Script 1:
PHP:
<?php
session_start ();             //session starten
$_SESSION['form_id'] = md5(microtime());        // ID erzeugen und in der Session speichern
?>
<html>
<body>
<form name="formular" method="POST" action="script_2.php">
<input type="hidden" name="id" value="<?php echo $_SESSION['form_id']; /* ID in das Hidden-Feld eintragen */ ?>" />
<input type="Submit" />
</form>
</body>
</html>

Script 2:
PHP:
<?php
session_start ();

// überprüfen, ob richtige ID
if (isset($_POST['id'] && isset($_SESSION['form_id'] && $_POST['id'] == $_SESSION['form_id'])
{
// ID ist richtig - also schnell löschen!
$_SESSION['form_id'] = "";

echo "Danke für Ihren Verkauf!";
}
else
echo "Sie haben diesen Artikel bereits verkauft!";
?>
Wenn man nun versucht das 2. Script doppelt zu laden wird die ID aus dem ersten Script ungültig.
 
Zurück