Na checken met !empty antwoorden laten staan
Ik ben bezig met een site met meerdere invulvelden.
Nu gebruik ik !empty om te kijken of er lege posts zijn.
Dit ziet er zo uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
if(!empty($_POST['onderwerp'])){
$sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')";
mysqli_query($mysql,$sql)
or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
echo"Het pta is ingevoerd!";
}
else{
echo"1 of meerdere velden zijn niet ingevuld!";
}
?>
if(!empty($_POST['onderwerp'])){
$sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')";
mysqli_query($mysql,$sql)
or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
echo"Het pta is ingevoerd!";
}
else{
echo"1 of meerdere velden zijn niet ingevuld!";
}
?>
Als het onderwerp niet ingevuld wordt, krijg je de melding "1 of meerdere velden zijn niet ingevuld!".
Maar als dit gebeurt, worden alle andere ingevulde velden weer leeggemaakt en moet je alles weer opnieuw invullen.
Weet iemand hoe ik ervoor kan zorgen dat de oude waardes blijven staan en dat ik alleen het onderwerp moet invullen?
Alvast bedankt
Ik neem wel aan dat je alle waardes netjes escapes met mysqli_real_escape_string().
Gewijzigd op 10/12/2018 10:55:53 door - Ariën -
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
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
<?php
session_start();
include "connect.php";
if(isset($_SESSION['user'])){
if(!in_array($_SESSION['user']['rol'],array("Sectievoorzitter","Afdelingsleider","Examensecretariaat") ) ){
exit();
}
}else{
exit();
}
?>
<head>
<link rel="stylesheet" type="text/css" href="menu.css">
<link rel="stylesheet" type="text/css" href="select.css">
</head>
<div class="navbar">
<a href="homepage.php">Home</a>
<a href="logout.php">Uitloggen</a>
</div>
<html>
<title>Pta invoeren</title>
<h1>Hier kunt u een nieuw pta invoeren</h1>
</html>
<?php
if(isset($_POST["verzend"])){
$afkorting = mysqli_real_escape_string($mysql,$_POST['afkorting']);
$periode = mysqli_real_escape_string($mysql,$_POST['periode']);
$klas = mysqli_real_escape_string($mysql,$_POST['klas']);
$schooljaar = mysqli_real_escape_string($mysql,$_POST['schooljaar']);
$toets = mysqli_real_escape_string($mysql,$_POST['toets']);
$vorm = mysqli_real_escape_string($mysql,$_POST['vorm']);
$herkansing = mysqli_real_escape_string($mysql,$_POST['herkansing']);
$onderwerp = mysqli_real_escape_string($mysql,$_POST['onderwerp']);
$duur = mysqli_real_escape_string($mysql,$_POST['duur']);
$rapport = mysqli_real_escape_string($mysql,$_POST['rapport']);
$schoolexamen = mysqli_real_escape_string($mysql,$_POST['schoolexamen']);
$tijdsverlenging = mysqli_real_escape_string($mysql,$_POST['tijdsverlenging']);
$methode = mysqli_real_escape_string($mysql,$_POST['methode']);
$inleverdatum = mysqli_real_escape_string($mysql,$_POST['inleverdatum']);
$toelichting = mysqli_real_escape_string($mysql,$_POST['toelichting']);
$methode_toevoegen = mysqli_real_escape_string($mysql,$_POST['methode_toevoegen']);
if(!empty($_POST['onderwerp'])){
$sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')";
mysqli_query($mysql,$sql)
or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
echo"Het pta is ingevoerd!";
}
else{
echo"1 of meerdere velden zijn niet ingevuld!";
}
}
?>
<html>
<form method="post">
<div class="invoeren">
<?php
if($_SESSION['user']['rol'] == "Sectievoorzitter"){
$id=$_SESSION['user']['id'];
?>
Vak:<select name="afkorting">
<?php
$resultaat = mysqli_query($mysql,"SELECT vak FROM gebruikers WHERE id='$id'") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat)){
echo "<option value=\"{$rij['vak']}\">{$rij['vak']}</option>";
}
?>
</select><br>
<?php
}
else{
?>
Vak:<select name="afkorting">
<?php
$resultaat = mysqli_query($mysql,"SELECT * FROM vakken") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat)){
echo "<option value=\"{$rij['afkorting']}\">{$rij['naam']}</option>";
}
?>
</select><br>
<?php
}
?>
Periode/toetsweek:<select name="periode" id="styledSelect" class="select">
<?php
$resultaat1 = mysqli_query($mysql,"SELECT * FROM periode") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat1)){
echo "<option value=\"{$rij['Naam']}\">{$rij['Naam']}</option>";
}
?>
</select><br>
Klas:
<select name="klas">
<?php
$resultaat2 = mysqli_query($mysql,"SELECT * FROM klassen") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat2)){
echo "<option value=\"{$rij['Klas']}\">{$rij['Klas']}</option>";
}
?>
</select><br>
Schooljaar:
<select name="schooljaar">
<?php
$resultaat3 = mysqli_query($mysql,"SELECT * FROM schooljaar") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat3)){
echo "<option value=\"{$rij['Jaar']}\">{$rij['Jaar']}</option>";
}
?>
</select><br>
Toets:
<select name="toets">
<?php
$resultaat4 = mysqli_query($mysql,"SELECT * FROM toets") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat4)){
echo "<option value=\"{$rij['Toets']}\">{$rij['Toets']}</option>";
}
?>
</select><br>
Onderwerp:
<input type="text" name="onderwerp">
<br>
Duur:
<input type="text" name="duur">
<br>
Weging rapport:
<input type="text" name="rapport">
<br>
Weging SE:
<input type="text" name="schoolexamen">
<br>
Vorm:
<select name="vorm">
<?php
$resultaat5 = mysqli_query($mysql,"SELECT * FROM vorm ORDER BY Vorm DESC") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat5)){
echo "<option value=\"{$rij['Vorm']}\">{$rij['Vorm']}</option>";
}
?>
</select><br>
Tijdsverlenging:
<input type="text" name="tijdsverlenging">
<br>
Herkansing:
<select name="herkansing">
<?php
$resultaat6 = mysqli_query($mysql,"SELECT * FROM herkansing") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat6)){
echo "<option value=\"{$rij['Herkansing']}\">{$rij['Herkansing']}</option>";
}
?>
</select><br>
Gebruikte methode:
<input type="text" name="methode">
<br>
Inleverdatum:
<input type="date" name="inleverdatum">
<br>
Toelichting:
<input type="text" name="toelichting">
<br>
Methode toevoegen:
<input type="text" name="methode_toevoegen">
<br>
</div>
<input type="submit" value="Invoeren" name="verzend" />
</form>
</html>
session_start();
include "connect.php";
if(isset($_SESSION['user'])){
if(!in_array($_SESSION['user']['rol'],array("Sectievoorzitter","Afdelingsleider","Examensecretariaat") ) ){
exit();
}
}else{
exit();
}
?>
<head>
<link rel="stylesheet" type="text/css" href="menu.css">
<link rel="stylesheet" type="text/css" href="select.css">
</head>
<div class="navbar">
<a href="homepage.php">Home</a>
<a href="logout.php">Uitloggen</a>
</div>
<html>
<title>Pta invoeren</title>
<h1>Hier kunt u een nieuw pta invoeren</h1>
</html>
<?php
if(isset($_POST["verzend"])){
$afkorting = mysqli_real_escape_string($mysql,$_POST['afkorting']);
$periode = mysqli_real_escape_string($mysql,$_POST['periode']);
$klas = mysqli_real_escape_string($mysql,$_POST['klas']);
$schooljaar = mysqli_real_escape_string($mysql,$_POST['schooljaar']);
$toets = mysqli_real_escape_string($mysql,$_POST['toets']);
$vorm = mysqli_real_escape_string($mysql,$_POST['vorm']);
$herkansing = mysqli_real_escape_string($mysql,$_POST['herkansing']);
$onderwerp = mysqli_real_escape_string($mysql,$_POST['onderwerp']);
$duur = mysqli_real_escape_string($mysql,$_POST['duur']);
$rapport = mysqli_real_escape_string($mysql,$_POST['rapport']);
$schoolexamen = mysqli_real_escape_string($mysql,$_POST['schoolexamen']);
$tijdsverlenging = mysqli_real_escape_string($mysql,$_POST['tijdsverlenging']);
$methode = mysqli_real_escape_string($mysql,$_POST['methode']);
$inleverdatum = mysqli_real_escape_string($mysql,$_POST['inleverdatum']);
$toelichting = mysqli_real_escape_string($mysql,$_POST['toelichting']);
$methode_toevoegen = mysqli_real_escape_string($mysql,$_POST['methode_toevoegen']);
if(!empty($_POST['onderwerp'])){
$sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')";
mysqli_query($mysql,$sql)
or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
echo"Het pta is ingevoerd!";
}
else{
echo"1 of meerdere velden zijn niet ingevuld!";
}
}
?>
<html>
<form method="post">
<div class="invoeren">
<?php
if($_SESSION['user']['rol'] == "Sectievoorzitter"){
$id=$_SESSION['user']['id'];
?>
Vak:<select name="afkorting">
<?php
$resultaat = mysqli_query($mysql,"SELECT vak FROM gebruikers WHERE id='$id'") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat)){
echo "<option value=\"{$rij['vak']}\">{$rij['vak']}</option>";
}
?>
</select><br>
<?php
}
else{
?>
Vak:<select name="afkorting">
<?php
$resultaat = mysqli_query($mysql,"SELECT * FROM vakken") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat)){
echo "<option value=\"{$rij['afkorting']}\">{$rij['naam']}</option>";
}
?>
</select><br>
<?php
}
?>
Periode/toetsweek:<select name="periode" id="styledSelect" class="select">
<?php
$resultaat1 = mysqli_query($mysql,"SELECT * FROM periode") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat1)){
echo "<option value=\"{$rij['Naam']}\">{$rij['Naam']}</option>";
}
?>
</select><br>
Klas:
<select name="klas">
<?php
$resultaat2 = mysqli_query($mysql,"SELECT * FROM klassen") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat2)){
echo "<option value=\"{$rij['Klas']}\">{$rij['Klas']}</option>";
}
?>
</select><br>
Schooljaar:
<select name="schooljaar">
<?php
$resultaat3 = mysqli_query($mysql,"SELECT * FROM schooljaar") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat3)){
echo "<option value=\"{$rij['Jaar']}\">{$rij['Jaar']}</option>";
}
?>
</select><br>
Toets:
<select name="toets">
<?php
$resultaat4 = mysqli_query($mysql,"SELECT * FROM toets") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat4)){
echo "<option value=\"{$rij['Toets']}\">{$rij['Toets']}</option>";
}
?>
</select><br>
Onderwerp:
<input type="text" name="onderwerp">
<br>
Duur:
<input type="text" name="duur">
<br>
Weging rapport:
<input type="text" name="rapport">
<br>
Weging SE:
<input type="text" name="schoolexamen">
<br>
Vorm:
<select name="vorm">
<?php
$resultaat5 = mysqli_query($mysql,"SELECT * FROM vorm ORDER BY Vorm DESC") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat5)){
echo "<option value=\"{$rij['Vorm']}\">{$rij['Vorm']}</option>";
}
?>
</select><br>
Tijdsverlenging:
<input type="text" name="tijdsverlenging">
<br>
Herkansing:
<select name="herkansing">
<?php
$resultaat6 = mysqli_query($mysql,"SELECT * FROM herkansing") or die("De query op de database is mislukt!");
while ($rij = mysqli_fetch_assoc($resultaat6)){
echo "<option value=\"{$rij['Herkansing']}\">{$rij['Herkansing']}</option>";
}
?>
</select><br>
Gebruikte methode:
<input type="text" name="methode">
<br>
Inleverdatum:
<input type="date" name="inleverdatum">
<br>
Toelichting:
<input type="text" name="toelichting">
<br>
Methode toevoegen:
<input type="text" name="methode_toevoegen">
<br>
</div>
<input type="submit" value="Invoeren" name="verzend" />
</form>
</html>
Wordt het dan steeds
Gewijzigd op 10/12/2018 12:16:05 door Ben van Velzen
Je zou het volgende kunnen overwegen.
Test eerst of de ingevoerde inhoud correct is
1 Niet correct? Terug naar formulier, informatie is dat nog voorhanden
2 Wel correct? Nu pas gaan escapen en wegschrijven naar de database.
Okay waar te beginnen. Er worden hier zoveel zaken met voeten getreden...
Om allereerst antwoord te geven op je vraag: het is inderdaad mogelijk om de POST-waarden terug te plaatsen in het formulier, maar dat is alleen mogelijk als je het weergeven van het formulier combineert met het verwerken van het formulier, en dat is uit oogpunt van nette en overzichtelijke code schrijven niet zo fantastisch. Idealiter scheid je deze twee stappen, want het zijn echt twee verschillende acties: het een houdt zich bezig met het weergeven van een formulier in een HTML-document, en het ander betreft het verwerken van gePOSTe data.
Dan over dit HTML-document. Dit moet een kloppend HTML-document zijn. De <html>-tags staan wel op hele vreemde plaatsen en de <body>-tags ontbreken in het geheel. Indien een HTML-document niet kloppend is is er vervolgens geen enkele garantie dat de rest van je HTML werkt zoals je zou verwachten. Zorg dus dat je HTML op orde is/komt.
Een veelgebruikte -en nette- manier voor formulier-verwerking is het POST/redirect/GET patroon. Concreet wijst de POST-action naar een aparte URL die het formulier verwerkt en daarna doorstuurt (indien de validatie en verwerking succesvol was) of terugstuurt (indien de validatie niet slaagde). Hierbij twee aandachtspunten:
1. hier zul je dus over meerdere pagina's informatie moeten onthouden zodat je deze weer terug kunt plaatsen in het formulier indien er fouten waren;
2. er wordt gesproken over validatie: het is dus zaak om EERST al je DATA te inspecteren alvorens je deze probeert weg te schrijven naar je database; indien de DATA klopt kan deze de database in, indien de DATA niet klopt zou je teruggestuurd moeten worden naar het formulier met een toelichting wat hier niet aan klopt zodat deze informatie gecorrigeerd kan worden
En hoe zorg je er dan voor dat informatie wordt onthouden over meerdere pagina's? Stop het in $_SESSION, bij voorkeur in een sub-array voor formulierdata, bijvoorbeeld: $_SESSION['forms']['pta'] ofzo. Hierbinnen zou je ook nog onderscheid kunnen maken tussen de feitelijk ingevoerde data en bijbehorende foutmeldingen (respectievelijk subarrays 'data' en 'errors' ofzo). Vervolgens flag je de URL waarin het formulier wordt weergegeven, bijvoorbeeld met ?errors=1, wat vervolgens een trigger is om een mededeling te doen dat er iets foutging en dat er data in je sessie zit waarmee je het formulier initialiseert met eerder ingevoerde data.
Tot slot: het is altijd zaak om output te escapen. Hoe je dit doet, hangt van de context af.
In HTML gebruik je htmlspecialchars(), en in SQL gebruik je real_escape_string() in combinatie met quotes, want het een is niet veilig zonder het ander.
En als je zoiets hebt van "poeh dat is wel erg veel moeite voor iets relatief simpels" dan heb je misschien gelijk, maar het voegt ook een heleboel toe:
- gebruikersgemak en gebruiksvriendelijke interfaces
- geen troep in je database
en dat betaalt zich binnen een mum van tijd weer terug.
Idealiter voer je dit truukje niet elke keer opnieuw uit als je een formulier moet bakken maar schrijf je eenmalig de bouwstenen voor het creëren van pagina's en het bouwen van formulieren zodat je niet elke keer het wiel opnieuw hoeft uit te vinden. En als je daar geen zin in hebt, laat je dan een Content Management Systeem (CMS) aanmeten die dit al voor een groot deel voor jou heeft geregeld.
>> Vervolgens flag je de URL waarin het formulier wordt weergegeven, bijvoorbeeld met ?errors=1
Waarom dan niet in je sessie kijken of er een foutmelding is? Waarom een flag? (Het kan wel, maar ik vraag me af waarom je daarvoor kiest als je toch al een sessie gebruikt.)
Code (php)
De initialisatie van je formulier-data, als je dit meer in classes gaat gieten, heeft verschillende bronnen:
1. bij het initieel laden van de formulier pagina kan dit een array zijn met defaults;
2. bij het verwerken van het formulier is dit doorgaans $_POST;
3. en bij het falen van validatie en terugkeren in het formulier is dit $_SESSION.
Zo'n URL-variabele kan je helpen met het nemen van de beslissing waar deze data vandaan moet komen en is ook nodig om onderscheid te kunnen maken tussen geval #1 en #3.
Gewijzigd op 10/12/2018 15:44:50 door Thomas van den Heuvel
Op de server hoef je de controle dan alleen nog "voor de zekerheid" over te doen (iemand heeft javascript disabled, of zit gewoon te hacken). De afhandeling hoeft in die gevallen dan "minder mooi" te zijn.
Nog even een duit in het zakje mbt de discussie hierboven: Ik gooi alle meldingen in een array in de session (meldingstekst + type = algemeen, waarschuwing, fout, enz). Zodra er dan een pagina getoond wordt (dat kan dus pas de GET na een POST+redir zijn) wordt deze lijst met meldingen aan de HTML toegevoegd (en daarna dus geleegd).
Ik zeg niet dat het niet kan wat jij aangeeft. Ik vraag me alleen dus af waarom op die manier. In jouw voorbeeld zou ik de URL kunnen aanroepen met error flag terwijl er helemaal geen error is (wat bij slechte coding zou kunnen leiden tot een error). Session is betrouwbaarder dan een externe parameter dus vandaar dat ik me afvroeg of je daar een specifieke reden voor had.
@Thomas van den Heuvel , zou je een klein voorbeeldje kunnen geven?
Ik kan me nu niet echt er iets bij voorstellen :-)
Trouwens, waarom werkt dit eigenlijk niet?
Ik dacht dat Ariën zoiets zei
Gewijzigd op 10/12/2018 22:10:35 door Max Boer
Het is een PHP-variabele, dus moet je die binnen php-tags uitvoeren.
Ozzie PHP op 10/12/2018 21:38:34:
Ik vraag me alleen dus af waarom op die manier.
Omdat je mogelijk deze "toestand" buiten de formulier-functionaliteit nodig hebt, bijvoobeeld in een (main)template. Mogelijk moet je op grond van deze state ergens op een andere plek binnen de layout een of andere beslissing nemen (highlighting, andere stylesheet, weergeven van een blok tekst, noem het maar op). Het gebruik van een querystringparameter heeft een minimale impact met maximaal effect - dit is transparant en heeft minimale hard coding. Stel dat je op een specifieke manier zou controleren dat de verwerking van een formulier de mist in ging, dan kun je dit (op een andere plek) niet op een generieke manier controleren / hergebruiken, je zult dan allerlei afzonderlijke hard coded checks moeten doen.
tl;dr dit is een herbruikbare oplossing; als je veel met formulieren werkt is het standaardiseren van naamgevingen en dit soort generieke aanpakken handiger.
Ozzie PHP op 10/12/2018 21:38:34:
In jouw voorbeeld zou ik de URL kunnen aanroepen met error flag terwijl er helemaal geen error is (wat bij slechte coding zou kunnen leiden tot een error).
Uiteraard controleer je dan of de deelarrays die zouden moeten bestaan ook daadwerkelijk bestaan en anders val je terug op de defaults. Aan de andere kant, als iemand loopt te prutsen in de URL dan zou je op een gegeven moment de boel gewoon stuk kunnen laten gaan. Als iemand bewust van het gebaande pad is afgegaan dan moet je niet verbaasd zijn dat je op een gegeven moment poep aan de schoenen hebt :).
Ozzie PHP op 10/12/2018 21:38:34:
Session is betrouwbaarder dan een externe parameter dus vandaar dat ik me afvroeg of je daar een specifieke reden voor had.
Zoals hierboven aangegeven doe je beide. Het is inderdaad wel belangrijk dat je te allen tijde de regie houdt omdat je met user data te maken hebt, maar dat is niet zo ingewikkeld als je zoiets doet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$formData = $defaultFormValues; // fallback
$formErrors = array(); // init
$formName = 'myForm'; // (unieke) naam van huidig formulier
// de case waarin je terugkeert vanuit verwerking na mislukte validatie
if (isset($_GET['errors'])) {
// init fields
if (isset($_SESSION['form'][$formName]['fields'])) {
// op het moment dat deze key bestaat kun je er vanuit gaan dat deze
// passende (maar dus op een of andere manier niet kloppende of on-
// volledige) formulierdata bevat
$formData = $_SESSION['form'][$formName]['fields'];
}
// init errors
if (isset($_SESSION['form'][$formName]['errors'])) {
// kopieer foutmeldingen terug zodat je nu niet opnieuw hoeft te valideren
$formErrors = $_SESSION['form'][$formName]['errors'];
}
}
?>
$formData = $defaultFormValues; // fallback
$formErrors = array(); // init
$formName = 'myForm'; // (unieke) naam van huidig formulier
// de case waarin je terugkeert vanuit verwerking na mislukte validatie
if (isset($_GET['errors'])) {
// init fields
if (isset($_SESSION['form'][$formName]['fields'])) {
// op het moment dat deze key bestaat kun je er vanuit gaan dat deze
// passende (maar dus op een of andere manier niet kloppende of on-
// volledige) formulierdata bevat
$formData = $_SESSION['form'][$formName]['fields'];
}
// init errors
if (isset($_SESSION['form'][$formName]['errors'])) {
// kopieer foutmeldingen terug zodat je nu niet opnieuw hoeft te valideren
$formErrors = $_SESSION['form'][$formName]['errors'];
}
}
?>
De administratie in $_SESSION['form'][$formName] moet uiteraard wel altijd kloppen, zo zou je deze in het geheel moeten unsetten op het moment dat de verwerking succesvol was zodat je bij een nieuwe aanroep van een formulier ook echt weer een leeg formulier hebt. Maar dat is in principe ook de default toestand, dus ook dan zou je $_SESSION['form'][$formName] nogmaals, misschien ten overvloede, kunnen verwijderen.
Max Boer op 10/12/2018 22:01:40:
@Thomas van den Heuvel , zou je een klein voorbeeldje kunnen geven?
Ik kan me nu niet echt er iets bij voorstellen :-)
Ik kan me nu niet echt er iets bij voorstellen :-)
Maar wat ben je precies aan het maken? Betreft het in zijn totaliteit slechts één formulier, of wordt dit (uiteindelijk) een uitgebreid administratief systeem? Dit bepaalt (mede) je aanpak, en hoe je dingen zou moeten insteken.
Ook weet ik niet echt hoeveel zin een (werkend) voorbeeld heeft, want vervolgens ga je hiermee aan de slag en dan? Op het moment dat je bezig bent met de dingen die jij nu aan het doen bent: ik zie al wat rechtenbeheer enzo, dan wordt het tijd dat je (zelf) eens goed na moet gaan denken over de opbouw van de webpagina's waaruit jouw applicatie bestaat, en als je hierbij (veel) formulieren gebruikt dan is het ook zaak dat je het voor jezelf makkelijk maakt door dit proces te automatiseren waarbij je bouwstenen hebt waarmee je snel formulieren kunt bouwen en automatisch kunt valideren.
Als je met deze materie bezig bent dan komen er een heleboel verschillende disciplines bij elkaar. Elke discipline heeft zijn eigen specifieke regels die allemaal belangrijk zijn voor een correcte en veilige werking. Dit kan ik helaas niet in een simpel voorbeeld vangen.
Tevens, als je het principe begrijpt, dan kun je dit op tig manieren implementeren. Het enige wat ik in mijn vorige reacties heb voorgesteld is dat je de verschillende acties (het weergeven van een formulier, het verwerken van een formulier) opsplitst in op zichzelf staande stukken code (waarbij één groot if-statement dus waarschijnlijk niet zo'n strak plan is omdat je daarmee de acties niet echt scheidt en de code nogal onleesbaar wordt op den duur), deze zouden dus op een of andere manier gecompartimenteerd moeten worden. Hoe je dit doet mag je zelf weten. Dit zou je bijvoorbeeld kunnen bereiken door er simpelweg verschillende PHP-bestanden van te maken.
Dit introduceert vervolgens de noodzaak om DATA op een of andere manier over te hevelen van "actie A" naar "actie B" en een sessie ($_SESSION) is daar een prima medium voor.
En dan het belang van het controleren van de ingevoerde gegevens voordat je het de database inkiepert. Maar dit is gewoon een kwestie van de velden stuk voor stuk doorlopen en controleren in de verwerkstap. Hier zou je tevens een tijdelijk "data array" kunnen opbouwen die je later ofwel gebruikt om informatie weg te schrijven, ofwel om terug te sturen naar het formulier indien er fouten waren.
Klopt alles? kan het de database in.
Fouten? stop het eerdergenoemde data array terug in $_SESSION met wat extra kanttekeningen bij de invulvelden en stuur de gebruiker terug naar het formulier.
Hoe je dit implementeert hangt af van de schaal van je applicatie.
Gewijzigd op 11/12/2018 12:37:28 door Thomas van den Heuvel
Bedankt voor je hulp Adoptive Solution!
Dit werkt inderdaad.
Alleen heb ik een probleempje. In het begin kent hij de variable $methode nog niet.
Hij geeft dan de volgende foutmelding:
<br /><b>Notice</b>: Undefined variable: duur in <b>C:\Users\Max de Boer\Documents\JEL\Informatica\USBWebserver\root\invoeren.php</b> on line <b>139</b><br />
Hoe zou ik dit kunnen oplossen?
Ik waardeer je hulp Thomas, maar ik ben nog maar een beginneling. Ik zit op dit moment in 6 VWO en deze opdracht is voor school. Ik heb eigenlijk nog nauwelijks verstand van arrays en sessies :-)
Controleer met isset() of $duur bestaat, en dán pas echo'en.
Het werkt nu inderdaad
Code (php)
Bedankt voor al jullie hulp.
Max Boer op 11/12/2018 15:53:30:
Ik heb eigenlijk nog nauwelijks verstand van arrays en sessies :-)
Maar dit gebruik je wel in een eerder codefragment?
Max Boer op 11/12/2018 16:00:11:
Maar daar controleer je of de submit-knop is ingesteld? En vervolgens echo je $duur?
Waarom gebruik je niet een eenvoudige functie? Zoiets:
Code (php)
En ook in HTML zou je DATA moeten escapen zodat deze HTML-safe is, bijvoorbeeld met de volgende shorthand:
Het veilige formulierveld wordt dan, inclusief initialisatie:
Op het moment dat je een bewerking meer dan eens uitvoert moet je jezelf afvragen of het handig kan zijn om een functie te introduceren. Elke keer zo'n inline if-statement leest ook niet echt prettig.
Gewijzigd op 11/12/2018 16:27:04 door Thomas van den Heuvel