Formulardaten nach Verarbeitung löschen/ Redirect
bastold
- php
Hallo!
Ich habe ein Formular, mit dem Bilder und Texte hochgeladen werden können.
Um ein versehentliches Neuabsenden des Formulars (z.B. durch F5-Taste) zu verhindern, habe ich bisher immer ein Redirect am Ende der Verarbeitung ausgelöst.
Nun brauche ich aber einen Wert, der bei erfolgreicher Verarbeitung entsteht, möchte aber nach der Verarbeitung auf die Formularseite zurückkehren.
Ich könnte jetzt bei dem Redirect in der URL den Wert als GET-Feld mitgeben.
Gefällt mir aber aus ästehtischen Gründen nicht.
Gibt es noch andere Möglichkeiten, die Formulardaten zu "löschen/ leeren"?
Ein unset($_POST); hilft an der Stelle ja nicht weiter, oder?
Danke
Um ein versehentliches Neuabsenden des Formulars (z.B. durch F5-Taste) zu verhindern, habe ich bisher immer ein Redirect am Ende der Verarbeitung ausgelöst.
Und was soll das bringen? Wenn du bei der Gratis-Brezel-Verteilung bei der Politikveranstaltung deiner Wahl verhindern willst, dass sich jemand 2x ein Brezel holt, schickst du ihn doch auch nicht einfach zu einem anderen Stand sondern merkst dir sein Gesicht.
Erstelle einfach einen Streuwert aus den eingegebenen Werten und der Session des Besuchers, diese verspeicherst du gemeinsam mit den Formulardaten in deiner Datenbank oder wo auch immer - beim Absenden eines Formulars wird einfach geprüft, ob diese Prüfsumme schon existiert - und darauf kannst du reagieren, ohne Redirect.
Und was soll das bringen? Wenn du bei der Gratis-Brezel-Verteilung bei der Politikveranstaltung deiner Wahl verhindern willst, dass sich jemand 2x ein
Was ich machen möchte: jemand kann ein Bild hochladen. Wenn das Hochladen und Abspeichern auf Serverseite beendet ist, soll der Nutzer auf die Formularseite zurückkehren, um sofort ein weiteres Bild hochladen zu können.
Um dem Nutzer eine Info über Erfolg oder Misserfolg als Rückinformation zu geben, soll dann neben dem Formular quasi als Successinformation, das hochgeladene Bild zu sehen sein, mit dem Hinweis "Bild erfolgreich hochgeladen".
Danke
Was ich machen möchte: jemand kann ein Bild hochladen. Wenn das Hochladen und Abspeichern auf Serverseite beendet ist, soll der Nutzer auf die Formularseite zurückkehren, um sofort ein weiteres Bild hochladen zu können.
Er verlässt die Seite doch nie.
Uploadformular, Erfolgmeldung, Fehlermeldung, neues Uploadformular ist immer dasselbe Dokument.
Uploadformular, Erfolgmeldung, Fehlermeldung, neues Uploadformular ist immer dasselbe Dokument.
Ja, aber wenn der Nutzer z.B. F5 drückt, wird das Formular, samt seinen Inhalten, ja noch einmal abgeschickt. Und dich möchte nun nicht, dass die komplette Verarbeitung noch einmal passiert und so das Bild noch einmal abgespeichert wird.
Wenn der Nutzer wirklich will, dass das Bild 2x in der Datenbank gespeichert wird, soll er das Formular noch einmal komplett ausfüllen.
Ich möchte quasi eine Reload-Schutz bauen, der ohne einen Redirect auskommt.
Danke
Om nah hoo pez nyeetz, bastold!
wie suit schrieb
if (bild_in_der_datenbank_vorhanden) { bild in die Datenbank eintragen } else { Hinweis ausgeben, dass dieses Bild schon vorhanden ist und bitte unter einem neuen Namen abgespeichert werden soll }
Matthias
Na ok, hatte gehofft, dass das einfacher zu lösen ist :)
Werde dann doch erst mal auf das Redirect mit Parameterübergabe zurückgreifen, aber eure Hinweis eim Hinterkopf behalten. Und wenn das Projekt erst einmal steht und dann Zeit für Feinheiten ist, das noch Einbauen.
Vielen Dank und ich wünsch euch allen ne schicke Woche!
Na ok, hatte gehofft, dass das einfacher zu lösen ist :)
Das ist einfach.
Werde dann doch erst mal auf das Redirect mit Parameterübergabe zurückgreifen, aber eure Hinweis eim Hinterkopf behalten.
Das hingegen ist wesentlich komplzierter.
Hm, ist Ansichtssache :)
Mahlzeit bastold,
Und wenn das Projekt erst einmal steht und dann Zeit für Feinheiten ist, das noch Einbauen.
Also nie ... ;-P
MfG,
EKKi
Und wenn das Projekt erst einmal steht und dann Zeit für Feinheiten ist, das noch Einbauen.
Also nie ... ;-P
Sagen wir es so: ich bin sehr gewillt, das alles ordentlich umzusetzen :)
Hallo,
Und wenn das Projekt erst einmal steht und dann Zeit für Feinheiten ist, das noch Einbauen.
Also nie ... ;-P
Sagen wir es so: ich bin sehr gewillt, das alles ordentlich umzusetzen :)
ja, das mag schon sein. Aber eine bekannte Lebensweisheit besagt, dass nichts so dauerhaft ist wie ein Provisorium.
So long,
Martin
Hello,
wie suit schrieb
if (! bild_in_der_datenbank_vorhanden)
{
bild in die Datenbank eintragen
}
else
{
Hinweis ausgeben, dass dieses Bild schon vorhanden ist und bitte unter einem neuen Namen abgespeichert werden soll
}
Und dies bitte keinesfalls durch einen getrennten SQL-Select und anschließendes Insert lösen, sondern bitte mit einem Insert unique und anschließender Fehlerauswertung. Sonst baut man sich wieder ein TOCTTOU-Problem http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

Moin!
Das wird schwierig. Ich gehe davon aus, dass es sich nicht um ein System fuer nur einen User handelt. Es wird also wahrscheinlich ein neuer Bildname erstellt, wenn ein Bild hochgeladen wird, denn jeder User kann ein Bild lolcat.jpg hochladen - trotzdem sind die Bilder unterschiedlich. Die Dinger koennen auch aus unterschiedlichen verzeichnissen kommen... Woran erkennt man nun, dass ein Bild schon vorhanden ist?
Ich wuerd im Uploadformular vielleicht nen timestamp unterbringen. Wenn der in der Session schonmal da war, stimmt was nicht.
Man könnte einen Hash über das Bild bilden.
Hello,
Das wird schwierig. Ich gehe davon aus, dass es sich nicht um ein System fuer nur einen User handelt. Es wird also wahrscheinlich ein neuer Bildname erstellt, wenn ein Bild hochgeladen wird, denn jeder User kann ein Bild lolcat.jpg hochladen - trotzdem sind die Bilder unterschiedlich. Die Dinger koennen auch aus unterschiedlichen verzeichnissen kommen... Woran erkennt man nun, dass ein Bild schon vorhanden ist?
Das sollte man dann vielleicht auch pro User verwalten.
Ich wuerd im Uploadformular vielleicht nen timestamp unterbringen. Wenn der in der Session schonmal da war, stimmt was nicht.
Das wäre eine Möglichkeit.
Aber warum sollte der User dasselbe Bild zweimal hochladen (besser: speichern) müssen? Dagegen hilft doch tatsächlich eine Prüfsumme. Allerdings schützt das immer noch nicht vor unnötigem Traffic, denn die Prüfsumme kann ja erst erstellt werden, wenn das Bild auf dem Server angekommen ist.
Wichtig erscheint mit aber, dass das Bild z.B. mit getimagesize() auf seinen Typ geprüft wird, es nur angenommen wird, wenn der Typ auch stimmt und der Name keinesfalls 1:1 aus einer Usereingabe übernommen wird, sondern auf jeden Fall die Extension gemäß der Auskunft von getimagesize() richtgestellt wird auf dem Server und im Basisnamen keinerlei Pfadbegrenzer akzeptiert werden!
Außerdem sollte man für das per HTTP/s erreichbare Ablageverzeichnis im Dateisystem sämtliche Scriptparser und Executable-Flags ausschalten.
Der User könnte sonst ein Bild unter dem Namen "image.php" hochladen, dass von getimagesize() tatsächlich noch als JPEG erkannt wird, also abgespeichert werden würde...
Wenn man jetzt aber konsequent die Dateiendung richtigstellt (also den Namen zu "image.jpg"), würde das Bild zumindest nicht mehr automatisch durch den Parser gejagt werden.
JPEG-Images können Code enthalten, der auch tatsächlich ausgeführt werden würde...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

Hi!
Uploadformular, Erfolgmeldung, Fehlermeldung, neues Uploadformular ist immer dasselbe Dokument.
Ja, aber wenn der Nutzer z.B. F5 drückt, wird das Formular, samt seinen Inhalten, ja noch einmal abgeschickt. Und dich möchte nun nicht, dass die komplette Verarbeitung noch einmal passiert und so das Bild noch einmal abgespeichert wird.
Du kannst nur verhindern, dass ein Anwender dasselbe Bild zweimal hochlädt, wenn du eine Prüfsumme erstellst und die Prüfsumme des hochgeladenen Bildes mit denen der anderen Bilder vergleichst. Eine F5-Sperre allein verhindert ja nicht, dass er dasselbe Bild nochmal auswählt und in einem zweiten Vorgang abschickt, egal wie clever deine F5-Sperre ausgelegt ist. Somit ist also eine solche nicht sinnvoll.
Wenn der Nutzer wirklich will, dass das Bild 2x in der Datenbank gespeichert wird, soll er das Formular noch einmal komplett ausfüllen.
Wenn du aber doch doppelte Bilder gestattest, dann reicht gegen ein versehentliches Absenden auch der Bestätigungsdialog, den er beim F5en vorgesetzt bekommt.
Ich möchte quasi eine Reload-Schutz bauen, der ohne einen Redirect auskommt.
Einmal-Token heißt dafür das Suchstichwort.
Lo!
Hello,
Was ich machen möchte: jemand kann ein Bild hochladen. Wenn das Hochladen und Abspeichern auf Serverseite beendet ist, soll der Nutzer auf die Formularseite zurückkehren, um sofort ein weiteres Bild hochladen zu können.
Er verlässt die Seite doch nie.
Uploadformular, Erfolgmeldung, Fehlermeldung, neues Uploadformular ist immer dasselbe Dokument.
Das ist nur dann der Fall, wenn AJAX eingesetzt wird, und auch dann wird das Dokument manipuliert.
Es mag zwar immer dieselbe Ressource angefordert werden, aber immer mit anderen Parametern. Die erzeugt dann auch immer neue Dokumente.
Es ist im übrigen gar nicht dumm, Datenuploads mit POST und Datendownloads konsequent mit GET abzuwickeln.
Mir würde dafür der Status 303 einfallen
http://de.wikipedia.org/wiki/HTTP-Statuscode
303 See Other
Die Antwort auf die durchgeführte Anfrage lässt sich unter der
im „Location“-Header-Feld angegebenen Adresse beziehen.
Wenn man partout bei POST bleiben will, dann wäre ggf. Status 205 der passende
205 Reset Content
Die Anfrage wurde erfolgreich durchgeführt; der Client soll das Dokument
neu aufbauen und Formulareingaben zurücksetzen.
Der Roundturn eines Vorganges, den ich mir vorstelle, würde also ungefähr so aussehen
REQUEST GET Ressource mit Eingabeformular anfordern
RESPONSE (Status 200) Dokument mit Formular liefern
REQUEST POST ausgefülltes Formular an den Server senden und die Ressource
mit entsprechenden Parametern anfordern (z.B. "cmd=imageupload")
RESPONSE (Status 303)
REQUEST Antwort anfordern mit den passenden (eben bezogenen) Parametern
RESPONSE (Status 200) Antwort, ggf. neues Formular liefern
Der Vorteil daran wäre mMn, dass man sich über nicht funktionierende Cache-Strategien auf dem Client keine Gedanken mehr machen muss und der Server aufgrund der Parameter, der Session-ID usw. erkennen kann, ob er überhaupt noch Daten rausrücken muss und will, oder ob sich da jemand einen uralten GET-Request gespeichert hat. Und selbst dann könnte er noch sinnvoll reagieren und eine passende Standardauskunft geben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
