Post Redirect Get
Inhoud |
Post / Redirect / Get
Omschrijving
Wie kent de melding niet? Bij het drukken op F5 na een POST request, komt de browser met de melding dat de POST dat opnieuw verzonden moet worden en de vraag is aan de gebruiker of hij dit wilt of niet. Vanuit het oogpunt van de browser is dit begrijpelijk, maar het kan resulteren in vreemde situaties, zoals dubbele boekingen, dubbele topics op een forum, of erger, dubbele overboekingen vanaf je bankrekening of het verwijderen van meerdere regels van een factuur.
Probleem
Bij het vernieuwen van de betreffende pagina herhaalt de browser de laatste bewerking: een POST request naar een bepaalde pagina, met de gegevens die ook in het vorige request werden verzonden.
Oplossing
De enige juiste oplossing van het probleem is door een redirect te doen na het POST request, zodat het een nieuw GET request wordt. Hiervan moet de browser op de hoogte gesteld worden, zodat de browser weet dat hij een nieuw GET request moet doen.
Voorbeeld
Om het probleem en de oplossing duidelijk te houden, heb ik alleen control-structures in de code geplaatst met opmerkingen:
<?php if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // We hebben een post. // Valideer de waarden van het request. if( isValid( $_POST ) ) { // De waarden uit $_POST zijn in orde. // doe iets met je database. if( $mydb->accountTransaction( $_POST['to'], $_POST['from'], $_POST['amount'] ) ) { // transactie is gelukt! $successpage = 'http://www.mijnsite.nl/transaction/success/'; // altijd een exit na een location: header! } // transactie is mislukt, fouten weergeven. } // Waarden van POST zijn niet in orde, fouten weergeven. } // formulier weergeven. ?>
Eventueel kun je ook na het constateren van de mislukte transactie of niet valid inhoud van je $_POST een redirect doen. Afhankelijk van je toepassing kan het mogelijk nuttig zijn om je server niet keer op keer met foute invoer te vermoeien.
Voordelen
Gezien er nu uiteindelijk een GET request als laatste bewerking in de browser staat, is het niet mogelijk om de POST waarden per ongeluk tweemaal te verzenden.
Nadelen
Geen.
Mogelijke problemen
Headers Already Sent errormelding.
Ook bruikbaar voor
Dit principe kan ook toegepast worden bij acties die via de url parameters geregeld worden. Bijvoorbeeld:
HTTP/1.1 POST http://voorbeeld.nl/script.php?delete_item=10
Waarbij eenmalig wissen van het item genoeg is, of
HTTP/1.1 POST http://webshop.nl/winkelwagen.php?add_product_id=100
waarbij je na een refresh niet 2x product 100 in je winkelwagentje wilt hebben.





