Sessie variabelen eerste keer niet weggeschreven
Ik heb een zeer eigenaardig probleem: ik heb een soort wizard die uit een aantal pagina's bestaat. Op elke pagina heb ik een aantal velden, de ingevulde waardes worden weggeschreven
naar een sessie en zijn zo op de laatste pagina allemaal beschikbaar om weg te schrijven naar
een database. Wanneer ik echter de waardes op de eerste pagina invul worden ze niet in een sessie gezet, ik wordt wel netjes doorverwezen naar pagina 2. Ga ik vervolgens opnieuw terug naar pagina 1 en doe ik het opnieuw worden ze wel naar een sessie geschreven. Er lijkt mij
dus niets mis met de code, daar het de tweede keer wel functioneert, maar de eerste keer gebeurd er gewoon telkens niets. Wat kan dit veroorzaken? Elke pagina begint gewoon netjes met session_start() zonder onnodige spaties ervoor etc.
Bedankt!
Sander
The code of page 1:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<?php
session_start();
$username="...";
$password="...";
$database="...";
$host="....";
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Er zijn gegevens verstuurd naar deze pagina!
// We gaan de errors in een array bijhouden
$aErrors = array();
if (empty($_POST['voornaam'])) {
$aErrors['voornaam'] = 'Vul a.u.b. uw voornaam in';
}
if (empty($_POST['achternaam'])) {
$aErrors['achternaam'] = 'Vul a.u.b. uw achternaam in';
}
if (empty($_POST['telpersoon'])) {
$aErrors['telpersoon'] = 'Vul a.u.b. uw eigen telefoonnummer in';
}
if (empty($_POST['emailpersoon'])) {
$aErrors['emailpersoon'] = 'Vul a.u.b. uw eigen e-mailadres in';
}
if (empty($_POST['functie'])) {
$aErrors['functie'] = 'Vul a.u.b. uw functie binnen het bedrijf in';
}
}
if (isset($aErrors) && count($aErrors) == 0 ) {
$voornaam = mysql_real_escape_string( $_POST['voornaam'] );
$achternaam = mysql_real_escape_string( $_POST['achternaam'] );
$telpersoon = mysql_real_escape_string( $_POST['telpersoon'] );
$emailpersoon = mysql_real_escape_string( $_POST['emailpersoon'] );
$functie = mysql_real_escape_string( $_POST['functie'] );
$_SESSION['voornaam'] = $voornaam;
$_SESSION['achternaam'] = $achternaam;
$_SESSION['telpersoon'] = $telpersoon;
$_SESSION['emailpersoon'] = $emailpersoon;
$_SESSION['functie'] = $functie;
header('Location:http://www......nl/signup15.php');
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/algemeen.css" media="all" />
<link rel="stylesheet" type="text/css" href="css/signup.css" media="all" />
<link rel="stylesheet" type="text/css" href="css/sidebars.css" media="all" />
<link rel="shortcut icon" type="image/png" href="images/favicon.png" >
<title>Bedrijfsprofiel aanmaken | ...</title>
<meta name="keywords" content="..., bedrijfsprofielen">
<meta name="description" content="Maak hier uw eigen bedrijfsprofiel aan op ....nl">
</head>
<?php
include("./topbar.php");
?>
<div id="greenbar">
<div id="greenbarcenter">
<a href="index.php">home</a> > <a href="signup1.php">profiel aanmaken: stap 1</a>
</div>
</div>
<div id="contentcenter">
<div id="contentbox" ><Br />
<h1 style="color:#483435">Profiel aanmaken</h1><br /><p style="font-size:16px">U wilt een profielpagina voor uw bedrijf aanmaken. Daarvoor dient u een aantal stappen te doorlopen. Niet alle velden zijn verplicht, maar hoe meer gegevens u invult over uw
bedrijf, hoe beter uw vindbaarheid voor potentiële klanten. Velden met een <font color="red"><b>*</b></font> zijn verplicht. <br /><Br />
<?php
if (isset($aErrors) && count($aErrors) > 0 ) {
echo "<font color=\"red\">Uw profiel kon niet worden verzonden door de onderstaande foutmeldingen. <Br /><Br /></font>";
print '<ul class="errorlist">';
foreach ( $aErrors as $error ) {
print '<li>' . $error . '</li>';
}
print '</ul><br /><Br />';
}
?>
<h2>Stap 1: Persoonsgegevens</h2><Br />
<form method="post" enctype="multipart/form-data">
<table style="width: 100%">
<tr>
<td class="first">Voornaam:</td>
<td><input tabindex="1" type="text" name="voornaam" value="<?php echo isset($_POST['voornaam'])?$_POST['voornaam']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td class="first">Achternaam:</td>
<td><input tabindex="2" type="text" name="achternaam" value="<?php echo isset($_POST['achternaam'])?$_POST['achternaam']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td class="first">Telefoonnummer:</td>
<td><input tabindex="3" type="text" name="telpersoon" value="<?php echo isset($_POST['telpersoon'])?$_POST['telpersoon']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td></td>
<td><p style="font-size:10px">uw eigen telefoonummer</p></td>
</tr>
<tr>
<td class="first">E-mailadres:</td>
<td><input tabindex="4" type="text" name="emailpersoon" value="<?php echo isset($_POST['emailpersoon'])?$_POST['emailpersoon']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td></td>
<td><p style="font-size:10px">uw eigen e-mailadres</p></td>
</tr>
<tr>
<td class="first">Functie binnen het bedrijf:</td>
<td><input tabindex="5" type="text" name="functie" value="<?php echo isset($_POST['functie'])?$_POST['functie']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
</table>
<br /><Br />
<input tabindex="36" type="submit" value="Ga verder" style="padding:5px; margin-right:230px; float:right">
<Br /><Br /><Br /><Br />
</form>
</div>
<?php
include("./sidebar1.php");
?>
</div>
<div class="push"></div>
</div>
<?php
include("./footer.php");
?>
session_start();
$username="...";
$password="...";
$database="...";
$host="....";
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Er zijn gegevens verstuurd naar deze pagina!
// We gaan de errors in een array bijhouden
$aErrors = array();
if (empty($_POST['voornaam'])) {
$aErrors['voornaam'] = 'Vul a.u.b. uw voornaam in';
}
if (empty($_POST['achternaam'])) {
$aErrors['achternaam'] = 'Vul a.u.b. uw achternaam in';
}
if (empty($_POST['telpersoon'])) {
$aErrors['telpersoon'] = 'Vul a.u.b. uw eigen telefoonnummer in';
}
if (empty($_POST['emailpersoon'])) {
$aErrors['emailpersoon'] = 'Vul a.u.b. uw eigen e-mailadres in';
}
if (empty($_POST['functie'])) {
$aErrors['functie'] = 'Vul a.u.b. uw functie binnen het bedrijf in';
}
}
if (isset($aErrors) && count($aErrors) == 0 ) {
$voornaam = mysql_real_escape_string( $_POST['voornaam'] );
$achternaam = mysql_real_escape_string( $_POST['achternaam'] );
$telpersoon = mysql_real_escape_string( $_POST['telpersoon'] );
$emailpersoon = mysql_real_escape_string( $_POST['emailpersoon'] );
$functie = mysql_real_escape_string( $_POST['functie'] );
$_SESSION['voornaam'] = $voornaam;
$_SESSION['achternaam'] = $achternaam;
$_SESSION['telpersoon'] = $telpersoon;
$_SESSION['emailpersoon'] = $emailpersoon;
$_SESSION['functie'] = $functie;
header('Location:http://www......nl/signup15.php');
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/algemeen.css" media="all" />
<link rel="stylesheet" type="text/css" href="css/signup.css" media="all" />
<link rel="stylesheet" type="text/css" href="css/sidebars.css" media="all" />
<link rel="shortcut icon" type="image/png" href="images/favicon.png" >
<title>Bedrijfsprofiel aanmaken | ...</title>
<meta name="keywords" content="..., bedrijfsprofielen">
<meta name="description" content="Maak hier uw eigen bedrijfsprofiel aan op ....nl">
</head>
<?php
include("./topbar.php");
?>
<div id="greenbar">
<div id="greenbarcenter">
<a href="index.php">home</a> > <a href="signup1.php">profiel aanmaken: stap 1</a>
</div>
</div>
<div id="contentcenter">
<div id="contentbox" ><Br />
<h1 style="color:#483435">Profiel aanmaken</h1><br /><p style="font-size:16px">U wilt een profielpagina voor uw bedrijf aanmaken. Daarvoor dient u een aantal stappen te doorlopen. Niet alle velden zijn verplicht, maar hoe meer gegevens u invult over uw
bedrijf, hoe beter uw vindbaarheid voor potentiële klanten. Velden met een <font color="red"><b>*</b></font> zijn verplicht. <br /><Br />
<?php
if (isset($aErrors) && count($aErrors) > 0 ) {
echo "<font color=\"red\">Uw profiel kon niet worden verzonden door de onderstaande foutmeldingen. <Br /><Br /></font>";
print '<ul class="errorlist">';
foreach ( $aErrors as $error ) {
print '<li>' . $error . '</li>';
}
print '</ul><br /><Br />';
}
?>
<h2>Stap 1: Persoonsgegevens</h2><Br />
<form method="post" enctype="multipart/form-data">
<table style="width: 100%">
<tr>
<td class="first">Voornaam:</td>
<td><input tabindex="1" type="text" name="voornaam" value="<?php echo isset($_POST['voornaam'])?$_POST['voornaam']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td class="first">Achternaam:</td>
<td><input tabindex="2" type="text" name="achternaam" value="<?php echo isset($_POST['achternaam'])?$_POST['achternaam']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td class="first">Telefoonnummer:</td>
<td><input tabindex="3" type="text" name="telpersoon" value="<?php echo isset($_POST['telpersoon'])?$_POST['telpersoon']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td></td>
<td><p style="font-size:10px">uw eigen telefoonummer</p></td>
</tr>
<tr>
<td class="first">E-mailadres:</td>
<td><input tabindex="4" type="text" name="emailpersoon" value="<?php echo isset($_POST['emailpersoon'])?$_POST['emailpersoon']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
<tr>
<td></td>
<td><p style="font-size:10px">uw eigen e-mailadres</p></td>
</tr>
<tr>
<td class="first">Functie binnen het bedrijf:</td>
<td><input tabindex="5" type="text" name="functie" value="<?php echo isset($_POST['functie'])?$_POST['functie']:""; ?>" class="wizardinput" style="background-color:white;"> <font color="red" size="5"><b>*</b></font></td>
</tr>
</table>
<br /><Br />
<input tabindex="36" type="submit" value="Ga verder" style="padding:5px; margin-right:230px; float:right">
<Br /><Br /><Br /><Br />
</form>
</div>
<?php
include("./sidebar1.php");
?>
</div>
<div class="push"></div>
</div>
<?php
include("./footer.php");
?>
Gewijzigd op 29/08/2012 11:29:00 door Sander Vanier
show us some code?
Zonder relevante code is het glazen bollen werk helaas...
Ik had stiekem gehoop dat het een simpele stomme fout was, dus de code was misschien niet relevant. Alsnog toegevoegd!
overigens kan je maar 3 sessies tegelijk hebben dus dit is teveel.. wat je kan doen is de $_POST variabele in je session stoppen en daarmee het juiste stukje ophalen.
Waarom zouden er niet meer dan 3 $_SESSION vars mogen? Ik zie wel een hoop dingen die "fout / niet netjes" zijn maar niets wat de werking zou verstoren van het script.
Mijn oplossing:
- vanaf regel 87 de rest in een nieuwe php file stoppen, noem hem laatformzien.php
- regel 60:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if (isset($aErrors) && count($aErrors) == 0 ) {
$voornaam = mysql_real_escape_string( $_POST['voornaam'] );
$achternaam = mysql_real_escape_string( $_POST['achternaam'] );
$telpersoon = mysql_real_escape_string( $_POST['telpersoon'] );
$emailpersoon = mysql_real_escape_string( $_POST['emailpersoon'] );
$functie = mysql_real_escape_string( $_POST['functie'] );
include 'signup15.php';
}
else
include 'laatformzien.php';
?>
if (isset($aErrors) && count($aErrors) == 0 ) {
$voornaam = mysql_real_escape_string( $_POST['voornaam'] );
$achternaam = mysql_real_escape_string( $_POST['achternaam'] );
$telpersoon = mysql_real_escape_string( $_POST['telpersoon'] );
$emailpersoon = mysql_real_escape_string( $_POST['emailpersoon'] );
$functie = mysql_real_escape_string( $_POST['functie'] );
include 'signup15.php';
}
else
include 'laatformzien.php';
?>
En dan het hele sessie gebeuren en de redirect vergeten.
Werkt gewoon.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
# Set array $form_fields voor het opslaan van alle formulier velden.
$form_fields = array('voornaam', 'achternaam', 'telpersoon', 'emailpersoon', 'functie');
# Alle formulier velden doorlopen.
foreach($form_fields as $field){
# Beveiligen en in een session var opslaan.
$_SESSION[$field] = mysql_real_escape_string($_POST[$field]);
}
?>
# Set array $form_fields voor het opslaan van alle formulier velden.
$form_fields = array('voornaam', 'achternaam', 'telpersoon', 'emailpersoon', 'functie');
# Alle formulier velden doorlopen.
foreach($form_fields as $field){
# Beveiligen en in een session var opslaan.
$_SESSION[$field] = mysql_real_escape_string($_POST[$field]);
}
?>
Weet je zeker dat het niet fout gaat tijdens het weergeven de eerste keer?
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
niet op de juiste plaats wordt afgesloten.
Alles wat te maken heeft met $_POST moet binnen die accolades. (De sluitende accolade op lijn 57 moet sowieso (ten vroegste) op lijn 83 komen).
Nu verwerk je, bij het eerste verzoek, $_POST-gegevens die niet bestaan.
@John Berg, zoals ik zei, de Wizard bestaat uit 9 pagina's, dus jouw oplossing zal niet bruikbaar zijn.
@SanThe, het zou ook moeten werken, en toch doet hij niet wat er moet gebeuren. Ik heb op pagina 2 een array van de ingevulde gegevens neergezet en deze blijkt leeg te zijn. Op het einde van de wizard worden de verplichte gegevens gecheckt en ook dan geeft hij aan dat er geen gegevens ingevuld zijn op de eerste pagina.
@Mark, het gaat helaas niet fout bij het weergeven, zie de comment hierboven.
@Kris Peeters, het maakt niet uit of de accolade op 57 of 83 staat, die beïnvloedt niet de werking. Ik ben echt een beetje wanhopig en heb ik wel gewijzigd, helaas zonder resultaat.
Help!?
Je hebt, voor je met de header naar de volgende pagina gaat, al eens gecontroleerd of alle sessies een waarde hebben?
Sander Vanier op 28/08/2012 18:43:38:
Ik ben echt een beetje wanhopig en heb ik wel gewijzigd, helaas zonder resultaat.
Niet wanhopig worden, gewoon op een nette manier debuggen.
Regel voor regel af gaan om te checken of je runtime nog krijgt wat je denkt. Begin bij het einde, dus zoals Obelix al zegt. Haal de redirect header even weg en in plaats daarvan een print_r( $_SESSION ) en een print_r( $_POST ). Beide zouden de gegevens moeten bevatten die je denkt. Zo niet dan ga je elke keer een blokje terug om uit te zoeken waar de waardes nog wel kloppen.
Sander
Je gebruikt niet ergens $_SESSION = array(); oid? Want dan maak je hem weer leeg.
Sander Vanier op 28/08/2012 19:35:51:
een lege Array te zien terwijl ik daar print_r ($Session); heb staan.
Maar dan wel zo neem ik aan:
print_r($_SESSION);
Dit heeft er wel zeker iets mee te maken, als ik het opnieuw probeer zonder de computer te herstarten werkt alles prima. Het gaat om die eerste keer dat je op pagina1 komt van de Wizard. Nee, dit gebruik ik nergens, dan zou het ook de tweede of derde keer niet werken.
Sander
Toevoeging op 28/08/2012 19:45:05:
@SanThe: Uiteraard :)
Als de sessies gevuld worden, gaat het dus ergens mis tussen pagina 1 en 2.
Maak eens een nieuwe pagina en bouw die langzaam op naar zoals je nu pagina 2 hebt.
Begin met de sessies te controleren. Bestaan ze nog? Daarna (bv) de basis van de pagina. Uitbreiden met formulier. Dan de includes, etc. Kortom: debuggen. Je zult, zoals je het verhaal nu vertelt, op pagina 2 ergens iets fout doen.
Sander
Toevoeging op 28/08/2012 20:45:12:
Ik heb beide pagina's, 1 en 2 weer helemaal opgebouwd. Ik begrijp er gewoon niets van. Het lijkt alsof er iets mis gaat bij de headerveriwjzing naar de 2e pagina de eerste keer dat je op volgende drukt. Op pagina 1 worden wel degelijk de waardes juist toegekend naar de sessie variabelen, maar het lijkt net alsof er geen Sessie bestaat? Deze lijkt pas te worden aangeslingerd op het moment dat er wordt overgegaan van pagina 1 naar 2. Probeer je het namelijk opnieuw, dan lukt het wel, hoe is dit toch mogelijk?
Let op de spatie!
En, heel belangrijk!:
escapen doe je pas net voordat je de gegevens in de database zet, $_SESSION is ook manipuleerbaar door die hacker ratten.
Alternatief is om je pages in divs te zetten zodat met JS kunt pagen
Gewijzigd op 28/08/2012 20:46:53 door Ger van Steenderen
Sander