Ik heb in een website een groot aantal vragen die via een formulier moeten worden beantwoord.
Om het overzichtelijk te maken heb ik het formulier in 3 stukken verdeeld.(alle drie zijn php files)
Aan het eind van het eerste formulier wordt met een insert opdracht een aantal gegevens weggeschreven in een database. Daarna wordt doorgeschakeld naar het tweede formulier. De code is als volgt:

<?php
$sql = "INSERT INTO projecten (id, indiendatum, stichting, oprichting, anbi, website, stichtingdoel, contactpersoon, mailadres, telefoonnummer, kennisvandas, doelproject, inhoud)
VALUES('','$indiendatum','$_POST[stichting]','$_POST[oprichting]','$_POST[anbi]','$_POST[website]','$_POST[stichtingdoel]','$_POST[contactpersoon]','$_POST[mailadres]','$_POST[telefoonnummer]','$_POST[kennisvandas]','$_POST[doelproject]','$_POST[inhoud]')";

if ($conn->query($sql) === TRUE) {			
	$bericht .= "Er is een aanvraag1 gedaan voor een subsidie van de Stichting DAS";				
	$headers .= "From :  Stichting DAS\r\n";
    mail ("[email protected]", "Aanvraag t.b.v.Stichting Das ingestuurd", $bericht, $headers);
	$last_id = $conn->insert_id;
	$_SESSION["id"]= $last_id;	
	header('Location: ../html/invulformulier2.php');
?>


De overgang en het wegschrijven gaat zonder problemen.
Bij het tweede formulier maak ik gebruik van een update omdat ik de gegevens in 1 record wil hebben.
Ook dit gaat goed. De gegevens worden netjes weggeschreven maar dan ontstaat het probleem. Er wordt niet doorgeschakeld naar het derde formulier;
De code is:

<?php
$teller=$_SESSION["id"];

$sql = "UPDATE projecten SET resultaat='$_POST[resultaat]', statusproject='$_POST[statusproject]' , lokalebetrokkenheid= '$_POST[lokalebetrokkenheid]', partners='$_POST[partners]', controle='$_POST[controle]', risico='$_POST[risico]', verantwoording='$_POST[verantwoording]' WHERE id= $teller";


if ($conn->query($sql) === TRUE) {			
	$bericht .= "Er is een aanvraag2 gedaan voor een subsidie van de Stichting DAS";				
	$headers .= "From :  Stichting DAS<[email protected]>\r\n";
    mail ("[email protected]", "Aanvraag t.b.v.Stichting Das ingestuurd", $bericht, $headers);	
	header('Location: http://www.stichting-das.nl/html/invulformulier3.php');
?>


Heeft iemand een idee waarom de tweede keer niet wordt doorgeschakeld.
Als ik het test om mijn eigen computer en op een i-pad werkt het wel goed.

Er vanuitgaande dat je een CSRF token gebruikt die je zowel in sessie+form opslaat: op het moment dat je het formulier verwerkt (in een aparte stap) controleer je op het bestaan van het token in de sessie. Bestaat deze niet sla je (een gevalideerde) $_POST op in de sessie en stuur je iemand terug naar het formulier. Dit garandeert dat je nooit informatie kwijt raakt. Het enige wat de invuller hoeft te doen is snel door het formulier heenrennen om te constateren dat alle informatie nog steeds aanwezig is en nogmaals op de submitknop drukken.

En een sessie zet je voort met session_start() :). Als je zorgt dat dit een van de eerste dingen is die je regelt dan haakt dit (onder water doorstart) naadloos in in wat voor andere functionaliteit dan ook want voor hun lijkt het net alsof de sessie nooit was verdwenen. Dit houdt tevens in dat je niet allerlei toeters en bellen / voorzieningen hoeft aan te brengen om krampachtig de sessie in leven te houden. Deze verloopt, en gaat dan vrolijk weer verder.

Maar we wijken af van het onderwerp. De topicstarter moet gewoon eerst zijn code fixen en hier dan stap voor stap doorheen om te zien of de problemen nog spelen. Op dit moment is het grootste probleem informatie inwinning over wat er aan de hand is. Maar zoals ik al aangaf is dat zinloos omdat er op dit moment dingen in de code gebeuren die zelden tot nooit een goede afloop opleveren.

Dus. Nogmaals, fix eerst je code, en kijk dan of de problemen nog spelen.
>> En een sessie zet je voort met session_start()

Mits die niet is verlopen.
Als een sessie verlopen is dan is die verlopen... maaaarrrr.... alles wat in de vorige sessie in de database gegaan is en aan een (ingelogde) gebruiker gekoppeld is kan ook weer "uit de koelast" gehaald worden als deze gebruiker opnieuw ingelogd is. Dit kan een complete winkelwagen of meerdere formulieren zijn.
Dan heb je het dus niet over opslag in een sessiebestand maar in de database. Dat kan inderdaad.
Ozzie PHP op 05/03/2019 20:08:11

>> En een sessie zet je voort met session_start()

Mits die niet is verlopen.

En daar doelde ik ook op :P
Hmmm.....

Je kan wel een sessie vervolgen, mits deze uit een session-identifier komt, zoals via een GET of POST request, of via een cookie (wat vaak gebruikt wordt). Als een sessie na de gestelde tijd (die uit de session.gc_maxlifetime) verloopt omdat iemand een half uur op een pagina staat treuzelen voordat die doorklikt, dan wordt deze sessie niet automatisch verlengd.

Reageren