[PHP] Post-action pagina verstuurt gegevens opnieuw na F5*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo, ik ben een vrij jonge onervaren webdesigner, dus het zou best doen dat ik iets vrij voor de hand liggend of banaal fout doe.

Anyways, ik heb dus een formulier gemaakt in een html file, dat dus eenmaal geklikt op de 'submit' knop verwijst naar een php file, waar deze data samen met andere uitgeprint wordt.

Als ik nu in dat formulier de input typen invul met bepaalde data, en daarna beland op die php pagina, merkte ik iets vreemd op: hoewel ik de methode post gebruikt, wordt het formulier nogmaals ingevuld met dezelfde data en doorgestuurd als ik hier de pagina vernieuw. dat is vrij vervelend, want dat is natuurlijk niet bedoeld.


heeft iemand soortgelijke problemen en een oplossing?
alvast bedankt :)

Acties:
  • 0 Henk 'm!

Verwijderd

Je bedoeld F5 drukken terwijl je een submit / post gedaan hebt?

Dat is volgens mij normaal. Terug en opnieuw invullen > klik lost het op.

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Verwijderd schreef op woensdag 25 juli 2012 @ 23:25:
Je bedoeld F5 drukken terwijl je een submit / post gedaan hebt?

Dat is volgens mij normaal. Terug en opnieuw invullen > klik lost het op.
Ik zou verhaal + topic titel nog maar eens goed nalezen.

Oorzaak:
Op het moment dat je een formulier naar de server stuurt wordt er in jouw geval POST-gegevens opgestuurd. Deze gegevens lees jij uit met $_POST (of $_REQUEST, maar dat terzijde). In het bestand waar jij die gegevens uitleest, laat jij naar mijn vermoeden opnieuw het formulier zien (in het zelfde bestand zonder extra code). Dit werkt prima, maar de browser herkent nog steeds dat er net een formulier is verzonden. De browser onthoudt dus eigenlijk het zojuist gemaakte verzoek naar de server en dat is dus mét POST gegevens en de browser wil dan ook alles opnieuw versturen wanneer jij op F5 drukt/vernieuwt.

Oplossing:
Heel simpel: de POST gegevens kwijtraken. Dit doe je door het php-bestand een redirect (dit is namelijk standaard een GET request) te laten uitvoeren naar de pagina met het formulier indien alle velden zijn goedgekeurd of naar welke pagina dan ook.

Ik ga je geen link geven naar een kant-en-klaar stuk(je) code/functie, maar je kunt via Google met deze informatie een heel eind komen.

Mocht POST vs GET niet duidelijk zijn.

[ Voor 3% gewijzigd door C0rnelis op 25-07-2012 23:47 ]


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
C0rnelis schreef op woensdag 25 juli 2012 @ 23:44:
[...]
Oplossing:
Heel simpel: de POST gegevens kwijtraken. Dit doe je door het php-bestand een redirect (dit is namelijk standaard een GET request) te laten uitvoeren naar de pagina met het formulier indien alle velden zijn goedgekeurd of naar welke pagina dan ook.
Als ik het goed hierinner dien je wel een redirect met statuscode 303 mee te geven, anders werkt het alsnog niet.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • bartbh
  • Registratie: Maart 2004
  • Niet online
Zoals C0rnelis ook aangeeft, een redirect.

"redirect after POST" is de zoekterm die je op Google wil gebruiken :)

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

wackmaniac schreef op donderdag 26 juli 2012 @ 09:11:
[...]


Als ik het goed hierinner dien je wel een redirect met statuscode 303 mee te geven, anders werkt het alsnog niet.
"303 See Other" is inderdaad de aanbevolen manier volgens de HTTP/1.1 specs, maar vanwege de slechte ondersteuning hiervan door UA's zou ik eerder voor een "302 Found" gaan. Die heeft in de praktijk het gedrag gespecificeerd voor een 303, al zou strikt genomen bij een 302 de request method niet mogen veranderen en dat is hier wel gewenst.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:30

AW_Bos

Liefhebber van nostalgie... 🕰️

En een unset($_POST) na het actie van het versturen?
Zou dat trouwens helpen?

Dat heb ik nog niet geprobeerd, maar ziet er logisch uit ;)?

[ Voor 27% gewijzigd door AW_Bos op 26-07-2012 13:15 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • bartbh
  • Registratie: Maart 2004
  • Niet online
Nee, want zodra je op F5 drukt verstuur je als client opnieuw alle POST variabelen.

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 01:30

AW_Bos

Liefhebber van nostalgie... 🕰️

bartbh schreef op donderdag 26 juli 2012 @ 13:15:
Nee, want zodra je op F5 drukt verstuur je als client opnieuw alle POST variabelen.
Ah zo.... :)
Dan is de redirect de beste oplossing.... ;)

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • elnaeth
  • Registratie: Januari 2009
  • Laatst online: 09-09 17:47
Wikipedia: Post/Redirect/Get

Zo heet de techniek :) Is heel erg veel over te vinden met minimaal zoekwerk, waaronder allerlei best-practices. Succes!

Acties:
  • 0 Henk 'm!

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Kun je niet beter op dezelfde pagina als het formulier de data verwerken?
Ongeveer zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if (isset($_POST['submit')) {
unset($_POST['submit']);
/*checks uitvoeren/validaten
errors returnen bij foutieve invoer/*

/*Geen error.. oke dan verwerken /*
}

else {
// show (signup) form
}


Het is maar een idee, maar dan zit je niet met losse pagina's etc.
Hoe is die pagina trouwens opgevuld?

[ Voor 3% gewijzigd door BtM909 op 26-07-2012 13:54 ]


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Dat maakt natuurlijk geen fluit uit!

@AtleX; volgens mij valt dat wel mee. Ik gebruik het op een hele schep met sites en nog nooit heb ik hier meldingen over gehad dat het niet werkt. Gewoon doen zeg :)

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

androidfan22, ik verplaats je topic even naar Programming aangezien het over PHP (serverside) gaat.

Ik wil je overigens wel vragen om volgende keer je relevante code te laten zien waarmee je bezig bent. Anders wordt het teveel een scriptrequest :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
HollowGamer schreef op donderdag 26 juli 2012 @ 13:20:
Kun je niet beter op dezelfde pagina als het formulier de data verwerken?
Ongeveer zo:
*snip*
Het is maar een idee
Zoals boven je al is uitgelegd heeft dat geen enkele zin, de POST-data bevind zich primair bij de client, de server handelt dit enkel af. Als de client het nogmaals naar de server stuurt begint die weer van voor af aan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb dat even gegoogled, en kom uit op de header functie. via
<?php Header("Location: index.php") ?>
word je direct doorverwezen, als je die pagina bezoekt maar hier kan je ook een tijdsinterval op zetten.
Helaas vond ik de manier niet om de bezoeker pas door te verwijzen nadat ze zelf de pagina vernieuwd hebben.

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 19-09 21:09
Hoe bedoel je?
Bijvoorbeeld een gastenboek, heb je misschien nu:
Index.php met een lijst met reacties en een formulier om toe te voegen. Dit verstuur je naarr index.php, zodat je de reactie toevoegt en alle reacties (inclusief de nieuwe) ziet. Als je dan refresht, wordt de reactie nogmaals toegevoegd.
Als je dus in plaats van naar index.php naar save.php verstuurd, die jouw formulier opslaat, kan je daar een redirect naar index.php doen. Als mensen dan op F5 drukken, wordt het formulier niet opnieuw verstuurd. Ook als je op de terugknop drukt, krijg je dan niet de melding voor het opnieuw versturen.

[ Voor 6% gewijzigd door Barryvdh op 26-07-2012 20:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja, dat zou inderdaad het simpelste zijn, maar ik zou graag willen dat iets wordt toegevoegd eenmaal een reactie toegevoegd was, dat had ik dus voorlopig 'opgelost' door twee pagina's, index.php en index-upload.php (hiernaar werd je verwezen na het formulier) , waarbij het verschil tussen deze pagina's was dat op de eerste geen 'insert' mysql query was, en er ook geen tekst stond in de aard van 'reactie toegevoegd'.
Als ik echter kan instellen dat deze tekst automatisch wordt toegevoegd aan de pagina slechts als deze bereikt wordt door doorverwezen te worden door een andere pagina die de 'action' is van mijn form, i mijn probleem opgelost. :)

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Verwijderd schreef op donderdag 26 juli 2012 @ 19:52:
Ik heb dat even gegoogled, en kom uit op de header functie. via
<?php Header("Location: index.php") ?>
word je direct doorverwezen, als je die pagina bezoekt maar hier kan je ook een tijdsinterval op zetten.
Helaas vond ik de manier niet om de bezoeker pas door te verwijzen nadat ze zelf de pagina vernieuwd hebben.
Hoezo als ze zelf vernieuwd hebben?

Stappen:
1. Bezoeker gaat naar pagina.html
2. Bezoeker vult formulier in en dit wordt verstuurd naar pagina.php
3. pagina.php verwerkt de data en verwijst de gebruiker naar pagina.html:
PHP:
1
<?php header('Location: pagina.html', true, 303);


Gebruiker kan nu net zoveel F5 drukken al hij of zij wil en het formulier zal nooit opnieuw ingestuurd worden.

Of zie ik het nu verkeerd?

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
die methode gebruik ik nu ook, maar graag zou ik willen dat aan de pagina.html een tekst wordt toegevoegd nadat het formulier ingevuld is.

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Verwijderd schreef op zondag 29 juli 2012 @ 12:27:
die methode gebruik ik nu ook, maar graag zou ik willen dat aan de pagina.html een tekst wordt toegevoegd nadat het formulier ingevuld is.
Er zijn meer manieren om gegevens door te sturen naar een pagina dan het sturen van POST.
  1. $_GET
  2. $_SESSION
In het eerste geval kan je simpelweg volstaan met
PHP:
1
header('Location: '. $pagina . '?succes');


en in het tweede geval:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// voor de redirect
session_start();
$_SESSION['form_success'] = true;

// redirect
header('Location: '. $pagina);

// op de pagina met formulier
if( isset($_SESSION['form_success']) && $_SESSION['form_success'] === true ):
    print '<p>Een paragraaf met extra tekst die alleen verschijnt indien het formulier goed en wel is verzonden en de redirect heeft plaats gevonden. Deze paragraaf verdwijnt bij de volgende refresh.</p>');

    unset($_SESSION['form_success']);

endif;


Dit zorgt voor een paragraaf met extra tekst die alleen verschijnt indien het formulier goed en wel is verzonden en de redirect heeft plaats gevonden. Deze paragraaf verdwijnt bij de volgende refresh.

[ Voor 3% gewijzigd door C0rnelis op 29-07-2012 12:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat ziet er inderdaad een goede manier uit. Vooral de tweede, omdat de tekst dan zal verdwijnen nadat de pagina vernieuwd is. Alleen nog een vraagje. ik gebruik al sessies op men site voor logins etc. Voor de zekerheid: kan je meerdere sessies gebruiken door elkaar?

Acties:
  • 0 Henk 'm!

  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 26-08 22:21
Je zet het in dezelfde sessie, je krijgt namelijk een error wanneer je twee keer session_start() aanroept zonder tussendoor session_destroy() aan te roepen.
http://php.net/manual/en/function.session-start.php:
As of PHP 4.3.3, calling session_start() after the session was previously started will result in an error of level E_NOTICE. Also, the second session start will simply be ignored.

Acties:
  • 0 Henk 'm!

  • jeroenikke
  • Registratie: Augustus 2003
  • Laatst online: 09:20
De structuur heeft zelfs een naam:
Wikipedia: Post/Redirect/Get

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
heb deze code toegepast en na een paar errors eruitgevist te hebben werkt ze vlekkenloos.Bedankt !

Acties:
  • 0 Henk 'm!

  • Xantios
  • Registratie: Maart 2006
  • Laatst online: 17-09 15:29
Ik heb inderdaad ook altijd een session gebruikt, tegenwoordig zit het echter wel met redirects in me framework ( omdat dit "meer best practice" is

iets als dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// Create session
session_start();
// Set some var's
$_SESSION['bFormInstance'] = true;
$_SESSION['iSubmitErrorCode'] = 0;

if($_SESSION['bFormInstance']
{
  # Update SESSION var
  $_SESSION['bFormInstance'] = false;
   # Check form content ( $_POST )
}
else
{
  # generate a form or do something swifty ! 
}
?>

[ Voor 6% gewijzigd door Xantios op 29-07-2012 17:03 . Reden: oops, ?> vergeten! 0-) ]

Pagina: 1