Hallo allemaal,

Ik heb diverse tekst velden in een form staan, die na invullen onthouden moeten worden om door een andere pagina even worden uitgelezen om het af te drukken.

Nu weet ik niet of ik dat goed heb gedaan, aangezien die 2de pagina raar doet.

Ik had gelezen dat je dit moest doen met $session, dus heb ik dit gedaan.:

if (isset($_POST['submit'])){

$_SESSION['varname'] = $prodnr;

op mijn andere pagina roep ik die dan terug met

$prodnr = $_SESSION['varname'];

Nu is het zo vul ik mijn invul vakjes 1 en klik op submit zodat hij mijn andere pagina afdrukt met de ingevulde gegevens laat hij niets zien.
Sluit ik die pagina en klik ik weer op afdrukken , dan komt pas de waarden van mij erin.
Hij loopt zeg maar, altijd steeds achter, ik hoop dat ik dit een beetje goed uitleg voor jullie.

Gebruik ik nu iets fout waardoor dit gebeurd?
@Rob: Daar heb je gelijk ik, maar een recht hoort niet in een sessie. Stel je voor dat die wordt ingetrokken. Dan moet eerst die sessie verlopen voordat diegene zijn recht kwijt is. Maar ik snap je ernst.
Je zou belangrijke sessies met unset kunnen verwijderen na de foreach, of nog mooier om een array aan te maken met 'verboden veldnamen' die niet moeten worden gebruikt om tot een sessie te verwerken.

Data overbrengen van pagina naar pagina kan vrij simpel met hidden input velden.
Je kunt de waarde uitlezen bij de submit en weer toekennen bij de opbouw van een pagina.
"Alleen die refresh op die 2de pagina heb ik toch nog nodig anders loopt hij achter."
??

Zelf, en ik denk de meeste mensen hier, laat ik action='' leeg.

<form method='post' action='' target='_top'>

Dan volgt de action default de eigen pagina en blijft op de eigen pagina.
En als je dan zorgt dat aan het begin van de pagina de $_POST in de $_SESSION wordt opgeslagen heb je altijd de meest recente veldwaarden beschikbaar.
En dus ook na de doorklik naar een andere pagina.

Zelf laat ik na elke veldwaardewijziging het formulier opnieuw laden om steeds de meeste recente waarden gegarandeerd in de sessie te hebben:

# bovenaan pagina
foreach ($_POST as $key => $val)
    $_SESSION[$key] = $val; 
# ergens in het document bijvoorbeeld
$waarde = $_SESSION[$naam];
print "<input type='text' name='$naam' id='$naam' value='$waarde' onchange='this.form.submit()'/>";
# en dan kan er overal op de pagina een doorlink zijn zonder dat de data inconsistent wordt. 
print "<a href='volgendepagina' >Verder</a>";


[size=xsmall]Toevoeging op 16/08/2018 12:36:14:[/size]

Rob: "(even via de browser een input veldje aan het formulier toevoegen met de juiste waarde)."

Dat klinkt inderdaad eng. Ik wil dat wel even experimenteren. Hoe doe ik dat in Firefox?

Je kunt het makkelijker oplossen door de data gewoon in een eigen array in de sessie op te slaan, weet je zeker dat er nooit dingen overschreven worden:

$_SESSION['data'] = $_POST;
Je data vind je dan terug via:

$x = $_SESSION['data']['varname'];
Een sessie is in ieder geval niet bedoeld om informatie permanent op te slaan.

Ik neem aan dat de sessie hier wordt gebruikt voor een soort van bevestigingspagina zodat de invuller terug kan lezen en kan bevestigen wat deze heeft ingevuld alvorens er iets verzonden / permanent opgeslagen wordt?
Het is natuurlijk wel de bedoeling dat er eerst enige bewerking op $_POST variabelen wordt uitgevoerd, voor ze in de $_SESSION worden opgenomen. Bijvoorbeeld een veld moet worden overgeslagen, uitgefilterd, gecontroleerd of gecorrigeerd. Dus je ontkomt niet aan de foreach.
Oke thx mensen, dit is wel even stof dat ik op mijn gemak door moet lezen, maar ik ben al super blij dat jullie mij zo goed helpen en geduldig blijven, heb al eens anders meegemaakt in het verleden (wel ander forum).
@Paul, het mag best "rauw" de sessie in (waarbij je deze het beste in een apart straatje (subarray) kunt parkeren, zodat je deze kunt onderscheiden van mogelijke andere informatie die reeds in de sessie aanwezig is, zoals @Rob aangeeft), zolang er maar een voorgeschreven moment is dat alles wordt gevalideerd voordat het definitief wordt verwerkt.

Tot die tijd moet de rauwe informatie dus ook als zodanig behandeld worden: het is "user data", dus deze zou je in principe niet blindelings moeten vertrouwen.
@Thomas,

Ja, natuurlijk.
Maar qua dataconsistentie leef ik nog met het Pascal paradigma.

Ik zie het programma als een land.
Controleer bij de grens de inkomende ($_POST) goederen uitvoerig dan hoef je verder ($_SESSION) in het hele land geen controle meer uit te voeren.

Overigens negeer ik vrij makkelijk mijn eigen uitgangspunten.
Ik gebruik voor mijzelf een formulierobject met daarin rijkelijk $_POST en $_SESSION variabelen. :-)
Zie het fragment van een zelfbedruipende radiogroep. Altijd de actuele waarde rauw in de sessie.


# maakt een radiogroep, aOpschriften is enkelvoudige lijst van opschrifen
public function radioGroep($groepNaam, $aOpschriften, $verticaal = true) {
 $this->setVar($groepNaam, ''); // optioneel aanmaken sessievar 
 if (isset($_POST[$groepNaam]))
    $_SESSION[$groepNaam] = $_POST[$groepNaam];
 foreach ($aOpschriften as $tekst) {
    print "<input type='radio' name='$groepNaam' value='$tekst' onchange='this.form.submit()' ";
    if ($_SESSION[$groepNaam] == $tekst)
        print " checked='checked' ";
    print "/>$tekst";
    if ($verticaal)
       print "<br/>";
  }
return $_SESSION[$groepNaam];
}

# aanroep
$oF=new objFormulier($dbTabel); 
$oF->radioGroep('keuze',$aOpties);
# actuele waarde in $_SESSION['keuze']



Dat is toch een beetje escape-on-input ergens? Wat nu als formulierinvoer fout is en je deze terug wilt plaatsen in het formulier, lijkt mij het beste dat deze dan ongewijzigd is?

En je vult daar een sessie terwijl je al met output bezig bent? Gebruik je toevallig output buffering?

Ah well, zoals ik al zei - zolang er een duidelijk scheidslijn is tussen ongecontroleerd en schoon/veilig/gecontroleerd maakt het niet zoveel uit allemaal.

Reageren