Hallo,
ich habe ein Formular das Kundendaten in eine MySQL-Datenbank einträgt. Beim Datenbankeintrag verwende ich für das Feld: Kunden-ID das auto_inkrement-Attribut. Dadurch wird bei jedem neuen Kunden automatisch eine neue eindeutige Kunden-ID erzeugt. Leider habe ich jetzt festgestellt das die Betätigung des Refresh-Buttons im Browser dazu führt das ständig neue Kunden mit den gleichen Daten aber neuer Kunden-ID angelegt werden. Das soll natürlich nicht so sein. Ein neuer Kunde soll nur durch Betätigung des Speichern-BUTTONS angelegt werden.
Wie kann ich das am besten abstellen?
Hallo,
ich habe ein Formular das Kundendaten in eine MySQL-Datenbank
einträgt. Beim Datenbankeintrag verwende ich für das Feld:
Kunden-ID das auto_inkrement-Attribut.
Vor dem Eintragen des Kunden Abfragen ob der Name schon existiert in der Datenbank
weil, bei Refresh wieden die Post und Get Daten wieder übermittelt, da hilft auch nicht den Button zu sperren etc
Hallo,
Noch ein tipp wie ich das immer mache.
Ich lasse das Formular mit einen php script generieren und trage dort die letzte autoincement Id ein.
Dann beim empfangen und vor dem Eintragen überprüfe ich ob dieses die letzte ID war die in der DB steht, wenn ja, trage ein , wenn nein tue nicht (oder rückmeldung, Fomrular wurde schon gesendet
mach nach absenden und eintragen einfach nen header(„location: …“);
damit leitest du die ausgabe um und der refresh führt das script nicht wieder aus.
Gruß
Phillip
Hallo RakonDark,
Wo genau speicherst du denn die letzte ID hin? Nimmst du dafür eine session-Variable oder was?
Ich hab übrigens ein sich selbst aufrufendes Formular falls das was ändert.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo RakonDark,
Wo genau speicherst du denn die letzte ID hin? Nimmst du dafür
eine session-Variable oder was?
Ich hab übrigens ein sich selbst aufrufendes Formular falls
das was ändert.
Ja ich lass ne tabelle mitlaufen für die ausgelieferten ID’s
(da ich auch doppel namen habe die eingetragen werden )
tabelleFormularID
id auto_incement
Also wenn das Formular das erstemal erscheint,
mach ich sowas wie
LOCK TABLES
INSERT INTO tabelleFormularID VALUES ('')
SELECT id FROM tabelleFormularID ORDER by id desc
var $formid=$row[id];
UNLOCK TABLES
diese id geb ich dem Formular mit in einem unsichtbaren input feld
beim senden dann
var $formlastid = 0;
SELECT lastid FROM tabelleFormularID where id = $\_POST["formid"]
$formlastid=$row[id];
if ($formlastid \> 0) {
DELETE FROM tabelleFormularID WHERE id='".$formlastid."'
INSERT INTO tabelle VALUES ('',daten,daten,daten)
}
else {
Formular berechtigung abgelaufen
}
ich hoffe du verstehst
Grund für diesen Umstand :
- will ich kein weiteres Feld in der normalen tabelle
- will ich nicht das nach dem senden der User auf ZURÜCK oder REFRESH geht im Browser
In der Praxis untauglich sorry,
aber wenn der server zu lange braucht mit seiner antwort, klickt der user 4x auf den
SENDE button bevor die header location antwort kommt, damit sind dann 4 Einträge des selben Formulars vorhanden.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo,
Wie kann ich das am besten abstellen?
Schreibe ins Formular eine Zufallszahl in ein Hidden-Feld und auf dem Server in die Session:
Formular:
$reqid = rand(0,1000000);
$\_SESSION["reqid"] = $reqid;
?\>
Speichern:
if (!isset($\_SESSION["reqid"]) || ($\_SESSION["reqid"]!=$\_POST["reqid"])) {
// reload oder anderes Formular
} else {
unset($\_SESSION["reqid"]);
// Speichern
}
Wenn schon einmal gepeichert wurde, ist die ID in der Session gelöscht, wurde ein Anderes als das erwartete Formular gesendet, ungleich der gespeicherten ID.
Alexander
PS: Die unten angesprochene Umleitung per Header(„Location: …“) würde ich nach dem Speichern trotzdem machen, da ansonsten nicht nur beim Reload, sondern ggfs. auch beim Versuch zu drucken der „Fehler“ - Teil ausgeführt wird, da der Browser da auch einen Reload macht.
So ähnlich hab ich mir das auch gedacht.
Bei mir ist allerdings die ID Bestandteil der Kunden-Daten-Tabelle. Ich hab es aber damit nicht hinbekommen. Ist die separate ID-Tabelle unbedingt notwendig?
So ähnlich hab ich mir das auch gedacht.
Bei mir ist allerdings die ID Bestandteil der
Kunden-Daten-Tabelle. Ich hab es aber damit nicht hinbekommen.
Ist die separate ID-Tabelle unbedingt notwendig?
jup, damit du keine doppelten ID bekommst
es könnten ja 5 Leute das Formular aufrufen
dann würden 5leute dieselbe ID haben
und der erste würde gewinnen
auf zufalls zahlen vertrau ich nicht, weil es kann (auch wenn unwarscheinlich ) passieren das es dennoch genau dieselben zufalls zahlen sind , und das wäre ärgerlich für die herrschaften