$_POST reload verhindern

deintag85

Erfahrenes Mitglied
Hallo,

ich habe ein Uploadscript das Daten per $_POST übergibt. Wie kann ich verhindern dass beim Aktualisieren der seite (F5) nicht nochmal ein Eintrag in der DB gemacht wird und das File auch nicht nochmal hochgeladen wird.

Ich hab es mit

Code:
unset($_POST);

am Ende des Scriptes versucht, aber das scheint wohl nicht die Lösung zu sein.

Gibt es dafür eine Lösung, außer jetzt eine Reload-Sperre mit IP & Session zu machen?

Gruß
 
Ja, du prüfst ob der Button geklickt wurde:
PHP:
// Submit Button:
echo '<input type="submit" name="submit" value="Abschicken" />';
// Script nur ausführen, wenn der Button geklickt wurde:
if( isset( $_POST['submit'] ) && $_POST['submit'] == 'Abschicken' )
 
Zuletzt bearbeitet:
Da mit einem F5 Klick der Absende-butten Auch wieder mitgesendet wird bringt dieser Mechanismus nichts.

Eine wirksame alternative dagegen ist Formularen beim Posten eine ID mitzusenden. Sobald er die ID einmal erhalten hat erwartet er eine neue. (die erwartete in der Session Speichern) und vor jeder Verarbeitung eben überprüfen ob erwartete ID mit der gesendeten übereinstimmt.

Falls nicht kann man ja eine hübsche Warnung ausgeben.
 
Ja, du prüfst ob der Button geklickt wurde:
PHP:
// Submit Button:
echo '<input type="submit" name="submit" value="Abschicken" />';
// Script nur ausführen, wenn der Button geklickt wurde:
if( isset( $_POST['submit'] ) && $_POST['submit'] == 'Abschicken' )


so in etwa hatte ich es vorher auch schon aber das ändert nichts
Code:
if(isset($_POST['sent']) && $_POST['sent'] == 'Bild hochladen')
{

er hat ja anscheinend im cache die $_POST daten und verwendet sie immer wieder und wieder...man muss die $_POST daten löschen irgendwie :-/
 
Michael Engel hat natürlich völlig recht. Ich bin mir gerade nicht sicher an was ich dachte, als ich den Post verfasst habe :)
 
Du kannst auch einfach nach dem Upload per [phpf]header[/phpf] auf eine neue Seite weiterleiten, dadurch wird diese Refreshed, wenn F5 gedrückt wird und die Daten werden nicht erneut gesendet.
 
Du kannst auch einfach nach dem Upload per [phpf]header[/phpf] auf eine neue Seite weiterleiten, dadurch wird diese Refreshed, wenn F5 gedrückt wird und die Daten werden nicht erneut gesendet.

nene das will ich nicht, da nach dem upload die entsprechenden daten des uploades angezeigt werden. da kann ich die leute nicht auf ne neue seite schicken.

habs jetzt so versucht

auf der startseite

Code:
<? session_start(); ?>

und in der upload-php

Code:
<input type="hidden" name="<? echo session_name(); ?>" value="<? echo session_id(); ?>" />

ABER...wie stelle ich meine abfrage nun gescheiht rum? das vom Herrn Engel hab ich nicht GANZ verstanden.

Sobald er die ID einmal erhalten hat erwartet er eine neue. (die erwartete in der Session Speichern) und vor jeder Verarbeitung eben überprüfen ob erwartete ID mit der gesendeten übereinstimmt.

Die ID bleibt doch gleich und verändert sich nicht, oder? Wenn ich also Reload klicke hat er dennoch die gleiche ID empfangen? Oder auf welche Zeit geht die Session? Kann man die Session auf eine bestimmte Zeit machen? Sodass beim Reload oder so eine neue ID generiert wird?
 
Nimm nicht die session_id, sondern einen zufälligen Wert. Was sich anbietet, wäre time(). Den Zeitstempel speicherst du in eine Session Variable. Dann Überprüfst du:
PHP:
if( isset( $_SESSION['foo'] ) && $_SESSION['foo'] == $_POST['foo'] )
{
    // Script nicht ausführen...
}
else
{
    // Upload verarbeiten usw...
    $_SESSION['foo'] = $_POST['foo'];
    // Datenbankzeug...
}
 
Zurück