MySQL auto_increment und Browser-Refresh

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 :smile:

weil, bei Refresh wieden die Post und Get Daten wieder übermittelt, da hilft auch nicht den Button zu sperren etc :smile:

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 :smile:

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 :smile:

Grund für diesen Umstand :

  1. will ich kein weiteres Feld in der normalen tabelle
  2. 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 :smile:

es könnten ja 5 Leute das Formular aufrufen

dann würden 5leute dieselbe ID haben

und der erste würde gewinnen :smile:

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 :smile: