[PHP] probleem met form, validatie, sessie en back

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
sorry voor de vage titel maar ik kan m'n probleem niet echt veel beter omschrijven in 1 regel.

dit is de situatie:

ik heb een html formulier dat POST naar de pagina waar het formulier zelf op staat. dit vanwege het feit dat de ingevulde waarden serverside gevalideerd worden en evt. foutmeldingen meteen in het formulier verschijnen. als er geen fouten optreden doe ik een redirect naar de vervolgpagina met een location-header.

dit is het probleem:

als ik het formulier fout invul krijg ik de foutmelding te zien. als ik daarna de fout corrigeer en dus op de vervolgpagina uitkom en daarna op de 'back' knop van m'n browser klik, krijg ik een 404. dit is alleen het geval als ik in de formulier-pagina een sessie start.

het probleem doet zich dus alleen voor als ik het formulier eerst een keer fout invoer, en ik op de pagina een sessie start. bijgaand scriptje reproduceert het probleem:

PHP:
1
2
3
4
5
6
7
8
9
10
<?
session_start(); // <-- troublemaker!
if(isset($_POST["submit"]))
    if(empty($_POST["foo"])) echo "foutmelding!";
    else header("Location:vervolgpagina.php");  
?>
<form method="post">
    <input type="text" name="foo">
    <input type="submit" name="submit">
</form>


waar komt die 404 nou vandaan? als ik immers nogmaals 'back' klik of een relaod doe, werkt de pagina prima.

Acties:
  • 0 Henk 'm!

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 15-09 21:46
Wel een vreemd voorval, het kan te maken hebben met je Sessie ID. Probeer eens session_regenerate_id().

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat KoenieMan zegt. :)

Overigens wordt de waarde $_POST['submit'] niet geset als je je formulier doorstuurt met een enter in plaats van het klikken op de knop. Dan stopt je script nogal met werken. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Is het ook daadwerkelijk een HTTP 404 page not found, of zeg je dat omdat de melding die je te zien krijgt daar wel wat van weg heeft?

Want in het eerste geval zou het misschien helpen als je een action attribuut in je form zet. In het tweede geval zou ik eens kijken of het helpt om ipv een Location een Refresh header te gebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Het is op IE6 een 404 in de trant van "The page cannot be displayed". Op Firefox gebeurt iets wat vrij normaal oogt, namelijk een waarschuwing over dat je je POST opnieuw gaat versturen.

Een andere (refresh) header sturen helpt ook niet. Ik weet niet precies waar ik dat session_regenerate_id moet plaatsen, maar met trial&error kwam ik iig nergens.

Aangezien het dus eigenlijk alleen fout gaat op IE, zou het me niets verbazen dat ik met het versturen van de juiste headers hier wel iets op kan vinden. Maar de juiste combi heb ik nog niet gevonden...

Met een action wordt het er ook allemaal niet beter op, die had ik juist weggehaald om te kijken of daar evt. aan lag :)

http://php5.meneer.net/test/formbug.php
(1. niks invullen; 2. submit; 3. iets invullen; 4. submit; 5. back)

[ Voor 19% gewijzigd door Genoil op 21-09-2004 11:28 ]


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
In plaats van linken naar een nieuwe pagina, is het veel simpeler, handiger, en beter (browser onafhankelijk) om gewoon iets te doen in de trant van:
PHP:
1
include ('nextpage.php');

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
pierre-oord schreef op 21 september 2004 @ 11:31:
In plaats van linken naar een nieuwe pagina, is het veel simpeler, handiger, en beter (browser onafhankelijk) om gewoon iets te doen in de trant van:
PHP:
1
include ('nextpage.php');
ja daar heb ik ook over nagedacht, maar stel dat je login.php hebt met als vervolgpagina welcome.php, dan heb je dus de inhoud van welcome.php met als URL login.php. mijn appje is vrij pagina-georienteerd ipv dat alles bij wijze van spreken op index.php met een combi van includes werkt. ik heb het liefst dat een URL zo weinig mogelijk variabelen bevat en de naam van het bestand zo goed mogelijk z'n functie en/of inhoud reflecteert.

[ Voor 12% gewijzigd door Genoil op 21-09-2004 11:40 ]


Acties:
  • 0 Henk 'm!

  • MrDummy
  • Registratie: April 2000
  • Laatst online: 25-07 12:00

MrDummy

Nog steeds gek op anime...

Session_start()?

Dan gebruik je vooral $_SESSION['xxxx'] hiervoor. Alleen zo kun je login onthouden en is session id saven helemaal niet nodig zolang je boel mooi circuleert in zelfde browservenster of in zelfde frame. Dan zul je ontdekken dat pas na session_start() de gegevens uit $_SESSION benaderbaar zijn. Niet eerder.
session_start() moet zoveel mogelijk en nog beter op 1e regel van je php script staan. Helemaal bovenaan. Dan vergeet je niks en heb je geen probs met onbenaderbare $_SESSION.

De waarden in $_SESSION blijven behouden totdat je browservenster sluit of dat je boel reset. Het is globale variabele.

sessionid komt voor in cookie. Er mag helemaal geen html deel vooraf geladen zijn, noch een header. Dan werkt het met setcookie(...).

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
MrDummy schreef op 21 september 2004 @ 12:25:
Session_start()?

Dan gebruik je vooral $_SESSION['xxxx'] hiervoor. Alleen zo kun je login onthouden en is session id saven helemaal niet nodig zolang je boel mooi circuleert in zelfde browservenster of in zelfde frame. Dan zul je ontdekken dat pas na session_start() de gegevens uit $_SESSION benaderbaar zijn. Niet eerder.
session_start() moet zoveel mogelijk en nog beter op 1e regel van je php script staan. Helemaal bovenaan. Dan vergeet je niks en heb je geen probs met onbenaderbare $_SESSION.

De waarden in $_SESSION blijven behouden totdat je browservenster sluit of dat je boel reset. Het is globale variabele.

sessionid komt voor in cookie. Er mag helemaal geen html deel vooraf geladen zijn, noch een header. Dan werkt het met setcookie(...).
:? er staat toch session_start() helemaal bovenaan? dus ik begrijp eigenlijk niet zo goed wat je met je (overigens zeer goed kloppende) verhaal bedoelt?

Acties:
  • 0 Henk 'm!

  • sniek
  • Registratie: September 2004
  • Laatst online: 30-07 13:04

sniek

Got root?

Hallo, Session_start() mag niet in de body voorkomen maar moet in de headers worden meegestuurd. Dit is in ieder geval mijn ervaring met deze functie

Irrelevant by default - rm -rf /


Acties:
  • 0 Henk 'm!

Verwijderd

ook altijd een exit of die(); doen nadat je een header('location: xxx'); doet zodat code na de redirect niet word uitgevoerd of verzonden.

edit: en ik weet niet precies of het uitmaakt maar gebruikelijk is een spatie na de dubbele punt na "Location:" in header();

[ Voor 35% gewijzigd door Verwijderd op 21-09-2004 13:07 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
sniek schreef op 21 september 2004 @ 13:02:
Hallo, Session_start() mag niet in de body voorkomen maar moet in de headers worden meegestuurd. Dit is in ieder geval mijn ervaring met deze functie
maar ik heb session_start toch helemaal bovenaan staan? dat betekent dat die sowieso voor alle output komt. het heeft wel iets met daarmee te maken, maar ik geloof niet dat de huidige plek van session_start() verkeerd is...

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
-- verwijderd omdat ik dacht dat het werkte maar het werkt nog steeds niet --

[ Voor 98% gewijzigd door Genoil op 21-09-2004 13:28 ]


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
De pagina die ik te zien krijg is normaal: als je in IE op de back-knop klikt, en de vorige pagina in de history een pagina is die aangeroepen werd met een POST, dan is de pagina nu 'verlopen': hij komt immers uit je cache, en er wordt niet opnieuw een POST verzonden.

Je knutselt hier omheen door:
a) je foutmelding in/onder/boven je formulier te zetten (bijvoorbeeld bij het veld dat de fout veroorzaakt, je kan dan meteen de laatste invoer laten zien)
b) als je per se de foutmelding op een aparte pagina wil zetten, en dan met de back-knop terug: je zal een GET form action moeten gebruiken vermoed ik. Het kan zo zijn dat IE deze melding altijd weergeeft als je 'terug' gaat naar een pagina met een eerder naar de server verzonden formulier, dat zul je zelf even moeten testen.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
B-Man schreef op 21 september 2004 @ 13:50:
De pagina die ik te zien krijg is normaal: als je in IE op de back-knop klikt, en de vorige pagina in de history een pagina is die aangeroepen werd met een POST, dan is de pagina nu 'verlopen': hij komt immers uit je cache, en er wordt niet opnieuw een POST verzonden.
krijg je dat ook als je naar die url gaat die ik hierboven gepost hebt en precies doet wat er staat in de stappen 1 t/m 5*? ik krijg toch echt een 'page cannot be displayed', en niet de bekende "Warning, page has expired".

*)
http://php5.meneer.net/test/formbug.php
(1. niks invullen; 2. submit; 3. iets invullen; 4. submit; 5. back)
Je knutselt hier omheen door:
a) je foutmelding in/onder/boven je formulier te zetten (bijvoorbeeld bij het veld dat de fout veroorzaakt, je kan dan meteen de laatste invoer laten zien)
dat is precies wat ik nu doe. ik stuur de mensen pas door als alles goed is. de enige manier waarop het nu fout gaat is 1-5 doorlopen zoals hierboven beschreven.
b) als je per se de foutmelding op een aparte pagina wil zetten, en dan met de back-knop terug: je zal een GET form action moeten gebruiken vermoed ik. Het kan zo zijn dat IE deze melding altijd weergeeft als je 'terug' gaat naar een pagina met een eerder naar de server verzonden formulier, dat zul je zelf even moeten testen.
dat hoeft dus niet :)

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik kwam er toevallig net achter dat er meer sites zijn die dit probleem hebben, volgens mij is het gewoon een IE bug...

ik heb inmiddels een aardige workaround, namelijk de sessie gewoon niet starten op het moment dat er fouten zijn in de invoer van het formulier. sessievariabelen die je echt altijd nodig hebt in de pagina kunnen gewoon met de $_POST mee.

Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Genoil schreef op 21 september 2004 @ 14:02:
[...]


krijg je dat ook als je naar die url gaat die ik hierboven gepost hebt en precies doet wat er staat in de stappen 1 t/m 5*? ik krijg toch echt een 'page cannot be displayed', en niet de bekende "Warning, page has expired".
Ja, heb ik exact zo gedaan. Ik draai IE 6 SP1 met wat fixes, op win2k.

Overigens vind ik de 'page has expired' niet meer dan logisch, aangezien ik terug probeer te gaan naar een eerder gesubmitte pagina (waarvan de browser dus weet dat er serverside iets verwerkt kan zijn).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik weet niet of iemand hier nog op zit te wachten, maar ik had dit probleem ook en heb een oplossing gevonden.

Na de aanroep van session_start() voeg je de volgende regel toe:

header("Cache-control: private");

dit zorgt ervoor dat je weer terug gaat naar het formulier en met de ingevulde waarden!
Pagina: 1