erneutes senden der Daten bei Reload verhindern
Maresa P.
- php
Hallo,
ich habe folgendes (eogenltich nicht PHP spezifisches Problem):
Auf meiner Website haben die Benutzer die Möglichkeit einen Eintrag im Gästebuch zu hinterlassen.
Dies geschieht folgendermasen:
1. Benutzer gibt Daten in HTML Formular ein und sendet das Formular ab. Als Formular Action ist gleiche Datei definiert. D.H. das Formular ruft sich selbst auf.
2. Mittels if Abfrage wird überprüft ob die Daten gesendet wurden. Ist dies der Fall, werden die Daten in einer MySQL Datenban gespeichert
Jetzt habe ich folgendes Problem:
Sobald ein User einen Eintrag verfasst hat und dann im Browser auf "aktualieseren" klickt, passier folgendes:
Das Dokument wird erneut angefordert und die vorher eingegebenen Daten werden erneut mitgeschickt. Die Daten werden also erneut in der Datenbank gepsichert.
Frage:
Wie kann ich das effizient verhindern?
Vielen Dank für Euere Hilfe
Maresa P.
Hallo,
im Archiv wurde dieses Thema schon mehrfach diskutiert. Es ist prinzipiell nicht möglich dies über den Browser zu verhindern - Du solltest dir entweder ein System mit einem Zeitstempel überlegen oder eben prüfen, ob die gesendeten Daten schon in der Datenbank sind und sie dann einfach nicht mehr speichern.
MfG
Rouven
Hi!
im Archiv wurde dieses Thema schon mehrfach diskutiert. Es ist prinzipiell nicht möglich dies über den Browser zu verhindern - Du solltest dir entweder ein System mit einem Zeitstempel überlegen oder eben prüfen, ob die gesendeten Daten schon in der Datenbank sind und sie dann einfach nicht mehr speichern.
Oder Du leitest nach dem Speichern mit header('Location...') irgendwo anders hin um, von mir aus sogar auf dasselbe Script, nur damit erzeugst Du einen neuen Request wenn Du dann auf aktualisieren klickst wird _dieser_ erneut ausgeführt und der POST-Request ist vergessen.
Grüße
Andreas
Oder Du leitest nach dem Speichern mit header('Location...') irgendwo anders hin um, von mir aus sogar auf dasselbe Script, nur damit erzeugst Du einen neuen Request wenn Du dann auf aktualisieren klickst wird _dieser_ erneut ausgeführt und der POST-Request ist vergessen.
Hi Andreas,
sehr gute Idee! so werd ich des machen. Das erscheint mir am unkompliziertesten.
Vielen Dank und einen schönen Gruß
Maresa P.
Hallo,
Ich mache das auf meiner Seite mit einer Drittseite. Als erstes hat man die Gästebuchseite wo man sich eintragen kann. Mit einem Submit wird man auf eine PHP-Seite geleitet, die keine HTML Seite produziert, sondern nur den Eintrag in die Datenbank erledigt. Diese Seite leitet dann wieder auf die Gästebuchseite wo der Eintrag angezeigt wird. Bei einem Reload wird nur diese Seite wieder angezeigt und die Daten nicht neu verschickt.
Gruß,
Henning
Hi,
die Idee ist mir auch schon gekommen, nur wie reagierst du eigentlich dann statt auf aktualisieren auf ein zurück?
MfG
Rouven
Hallo,
die Idee ist mir auch schon gekommen, nur wie reagierst du eigentlich dann statt auf aktualisieren auf ein zurück?
Dann kommt man auf die Seite wieder auf die Seite auf der man die Daten eingeben kann. Sie werden aber nicht noch einmal abgeschickt. (Außer natürlich man drückt wieder auf absenden, aber das ist ja nicht das Problem)
Gruß,
Henning
Hi
Sobald ein User einen Eintrag verfasst hat und dann im Browser auf "aktualieseren" klickt, passiert folgendes:
Alle Einträge bzw. Aktualisierungen von Einträgen sollten in Extra-Dateien stattfinden. Formular leitet dorthin, es wird aktualisiert und das Script leitet wieder zurück. m.E. verhindert diese Abfrage einige Fehlerquellen ua. auch diese. Ausserdem, wenn Du es geschickt machst, werden Datenbankfehler nicht direkt angezeigt sobald sie auftreten. (Datenbankfehler sind ein Sicherheitsrisiko, da der User an Daten kommt, die er nicht wissen sollte.)
ciao
romy
Hmmm.. *ggg*
überprüf doch einfach ob dieser eintrag in der db schon vorhanden ist.
so... schaust du *gg*
----------------------
//suche nach dem gleichen eintrag in der db
$res =mysql_query("select * from gaestebuch where autorName='".$_POST["name"]."' and betreff='".$_POST["betreff"]."' and autorEmail='".$_POST["email"]."' and text='".$_POST["text"]."'");
$data=mysql_fetch_object($res);
//wenn betreff leer ist dann abspeichern
if($data->betreff==""){
mysql_query("Insert into gaestebuch (autorName,betreff,autorEmail,text,zeitpunkt)
values('".$_POST["name"]."',
'".$_POST["betreff"]."',
'".$_POST["email"]."',
'".$_POST["text"]."',
NOW()
)");
}else{
$_ERROR ="Achtung:<br>Daten können nur einmal abgespeichert werden<br>";
}
----------------------
gruss chris ;)
Hallo Maresa
Eine letzte Möglichkeit wäre das Setzen von Cookies. Da allerdings nicht alle Benutzer den ihrem Browser erlauben Cookies zu speichern, funktioniert diese Methode nicht 100%ig. Du kannst aber schon einen grossen Teil der User abfangen. So bleiben wahrscheinlich nicht mehr viele die die Seite reloaden UND Cookies nicht erlauben.
Gruss Daniel