# $_POST reload verhindern



## deintag85 (19. Juni 2008)

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


```
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ß


----------



## Loomis (19. Juni 2008)

Ja, du prüfst ob der Button geklickt wurde:

```
// 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' )
```


----------



## Michael Engel (19. Juni 2008)

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.


----------



## deintag85 (19. Juni 2008)

Loomes hat gesagt.:


> Ja, du prüfst ob der Button geklickt wurde:
> 
> ```
> // Submit Button:
> ...




so in etwa hatte ich es vorher auch schon aber das ändert nichts

```
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 :-/


----------



## Loomis (19. Juni 2008)

Michael Engel hat natürlich völlig recht. Ich bin mir gerade nicht sicher an was ich dachte, als ich den Post verfasst habe


----------



## deintag85 (19. Juni 2008)

Heisst soviel wie ich muss im so oder so ne Reload-Sperre mache, mit Session oder IP, oder wie?


----------



## Loomis (19. Juni 2008)

Ja.
( Text-zu-kurz )


----------



## mAu (19. Juni 2008)

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.


----------



## deintag85 (19. Juni 2008)

mAu hat gesagt.:


> 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


```
<? session_start(); ?>
```

und in der upload-php


```
<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?


----------



## Loomis (19. Juni 2008)

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:

```
if( isset( $_SESSION['foo'] ) && $_SESSION['foo'] == $_POST['foo'] )
{
    // Script nicht ausführen...
}
else
{
    // Upload verarbeiten usw...
    $_SESSION['foo'] = $_POST['foo'];
    // Datenbankzeug...
}
```


----------



## mAu (19. Juni 2008)

Was für Daten? Dateiname und sowas? Das kannst du im Zweifelsfall ja per GET der neuen Seite mitübergeben.

```
header('Location: upload-complete.php?file=datei.txt&size=1832834&foo=bar...');
```


----------



## deintag85 (19. Juni 2008)

```
Warning: Cannot modify header information - headers already sent by (output started at /srv/www/htdocs/web2/html/index.php:7) in /srv/www/htdocs/web2/html/upload.php on line 216
```

Kann es daran liegen dass in die upload.php in die index.php included habe
Wie kann man das nun wieder beheben?

Oder soll ich die <FORM> komplett in die index.php und dann als action ="upload.php" schreiben?

Ok, letztendlich hab ich es mit

```
echo "<meta http-equiv=\"refresh\" content=\"2;url=upload-complete.php?id=$xid\">";
```

gemacht und es scheint zu funktioniern.

Zu sehen gibts das auf 

URL von mir entfernt


----------



## Michael Engel (19. Juni 2008)

Habs Kaputt gemacht....



> Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /srv/www/htdocs/web2/html/upload-complete.php on line 104


----------



## deintag85 (19. Juni 2008)

nein schon richtig, ich bin nur am basteln. nur stellt sich heraus dass die upload-complete.php auch nicht das WAHRE ist.

denn nach jedem upload sollen ja "persönliche" links erscheinen und mit der upload-complete.php lässt sich ja einfach durch GET id für jedes bild der link anzeigen. das war vorher mit meinem include besser :-(


----------

