Formulier validatie
Het formulier mag alleen verstuurd worden als er maar liefst 1 of meerdere zijn ingevuld/geselecteerd.
Hoe doe ik dat?
Het maakt dus niet uit welke geselecteerd zijn, als het maar minimaal 1 is?
Gewijzigd op 19/02/2020 12:46:36 door - Ariën -
Jorn Reed op 19/02/2020 03:59:50:
ingevuld/geselecteerd.
Dit impliceert al twee verschillende validatieregels:
- een regel waarbij een veld simpelweg "niet leeg" is, wat dat ook moge zijn
- een regel waarbij een waarde uit een lijst van toegestane waarden is geselecteerd
Ik vind het sowieso een beetje een raar criterium, dat ten minste één ingevuld veld al voldoet. Doorgaans moet de validatie van alle velden succesvol zijn om formulierinvoer te accepteren. Want hoe verwerk je dit verder? Verwerk je enkel het veld dat goed was ingevuld?
Maar goed, als dat is wat je daadwerkelijk wilt, dan zou je het aantal succesvolle validaties kunnen tellen.
Maar wat "succesvol" is hangt dus van het type invoer af en wat jij beschouwt als "acceptabele invoer".
Ben ik toch benieuwd waarom het formulier zo in elkaar zit, waar het zo zou moeten werken, en wat je hiermee denkt te bereiken?
Gewijzigd op 19/02/2020 15:14:47 door - Ariën -
Mja, maar zouden dat soort zaken niet nog steeds onder één "veld" gegroepeerd zijn? Die heten toch doorgaans allemaal hetzelfde? Dus dan zou nog steeds alles gevalideerd moeten zijn, zelfs als je een "niet van toepassing" keuze hebt ofzo, die is dan nog steeds ingevuld.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<form action="" method="POST">
Keuze 1: <input type="text" name="keuze[]"><br>
Keuze 2: <input type="text" name="keuze[]"><br>
Keuze 3: <input type="text" name="keuze[]"><br>
<input type="submit" name="submit" value="Verstuur!"><br>
</form>
<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
$arrayCleaned = array_filter($_POST['keuze']);
echo "<pre>".print_r($arrayCleaned ,true)."</pre>";
}
?>
Keuze 1: <input type="text" name="keuze[]"><br>
Keuze 2: <input type="text" name="keuze[]"><br>
Keuze 3: <input type="text" name="keuze[]"><br>
<input type="submit" name="submit" value="Verstuur!"><br>
</form>
<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
$arrayCleaned = array_filter($_POST['keuze']);
echo "<pre>".print_r($arrayCleaned ,true)."</pre>";
}
?>
Dit stript de lege velden, zodat je uiteindelijk met count() op de $arrayCleaned kan tellen.
Gewijzigd op 19/02/2020 16:22:54 door - Ariën -
Dit (aanpak TS) lijkt mij gewoon de verkeerde insteek, omdat je dan op een niet-/quasi-deterministische manier moet gaan beoordelen of je de invoer doorlaat of niet.
Tenzij je de combinaties die zijn toegestaan op een of andere manier volledig vastlegt. Maar ook dat lijkt mij een gekunstelde oplossing. Als je al deze problematiek simpelweg kunt voorkomen door je formulier anders op te zetten dan zou je dat gewoon moeten doen omdat dat de simpelste oplossing qua code levert.
Maar de topicstarter heeft niet verduidelijkt waarom deze opzet noodzakelijk zou zijn / er geen andere insteek mogelijk is.
Ik kijk liever eerst naar de aanpak voordat ik een oplossing formuleer.
Gewijzigd op 19/02/2020 16:35:15 door Thomas van den Heuvel
Gewijzigd op 19/02/2020 16:50:40 door - Ariën -
Toevoeging op 24/02/2020 16:16:12:
Stel ik gebruik die manier van arrays in de inputs, zou ik dan ook ervoor kunnen kiezen dat als je een opleiding kiest, dat er in de php komt te staan `opleiding: Pedicure`. Dus dat het type van de opleiding meegegeven word via de array waardes, zonder dat ik het er hardcoded in hoef te zetten.
```php
<form action="" method="POST">
Keuze 1: <select name="keuze['opleiding'][]"><br>
Keuze 2: <select name="keuze['cursus'][]"><br>
Keuze 3: <select name="keuze['workshop'][]"><br>
<input type="submit" name="submit" value="Verstuur!"><br>
</form>
```
Je kan van elke select maar 1 kiezen, maar er moet sowieso een opleiding, cursus of workshop aanwezig zijn in de form data.
Met mijn manier een enkele waarin je kan filteren.
Naam: Jip
Achternaam: De Raaf
Opleiding: -
Cursus: Voet massages
Workshop: -
In dit voorbeeld zie je dat hij de cursus select element alleen heeft geselecteerd. De andere heeft hij leeggelaten, en toch moet het formulier dan verzonden worden. Dat is een beetje wat ik probeer.
Waarom heb je 3 select menu's? Waarom niet gewoon 1?
Je kunt met optgroup groepen maken als Opleiding, Cursus, Workshop, maar dan kan er tenminste maar 1 keuze gemaakt worden en dus hoef je ook alleen hierop te controleren.
Of kan iemand meerdere dingen kiezen?
Toevoeging op 28/02/2020 17:16:32:
Misschien helpt dit je op weg?
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
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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
$keuzes = array_filter($_POST['keuzes']);
if(isset($keuzes) && count($keuzes) > 0) {
echo 'Een keuze gemaakt';
foreach($keuzes as $keuze) {
echo '<br>' . htmlspecialchars($keuze);
}
} else {
echo 'Geen keuze gemaakt';
}
}
?>
<form method="POST">
<div>
<select name="keuzes['opleiding']">
<option></option>
<option value="Pizza bakken">Pizza bakken</option>
</select>
</div>
<div>
<select name="keuzes['cursus']">
<option></option>
<option value="Pizza snijden">Pizza snijden</option>
</select>
</div>
<div>
<select name="keuzes['workshop']">
<option></option>
<option value="Pizza eten">Pizza eten</option>
</select>
</div>
<button>Verzenden</button>
</form>
if($_SERVER['REQUEST_METHOD'] == "POST") {
$keuzes = array_filter($_POST['keuzes']);
if(isset($keuzes) && count($keuzes) > 0) {
echo 'Een keuze gemaakt';
foreach($keuzes as $keuze) {
echo '<br>' . htmlspecialchars($keuze);
}
} else {
echo 'Geen keuze gemaakt';
}
}
?>
<form method="POST">
<div>
<select name="keuzes['opleiding']">
<option></option>
<option value="Pizza bakken">Pizza bakken</option>
</select>
</div>
<div>
<select name="keuzes['cursus']">
<option></option>
<option value="Pizza snijden">Pizza snijden</option>
</select>
</div>
<div>
<select name="keuzes['workshop']">
<option></option>
<option value="Pizza eten">Pizza eten</option>
</select>
</div>
<button>Verzenden</button>
</form>
Gewijzigd op 28/02/2020 17:17:32 door Michael -
Code (php)
1
2
3
2
3
<label><input type="checkbox" name="deelname[opleiding]">opleiding</label>
<label><input type="checkbox" name="deelname[cursus]">cursus</label>
<label><input type="checkbox" name="deelname[workshop]">workshop</label>
<label><input type="checkbox" name="deelname[cursus]">cursus</label>
<label><input type="checkbox" name="deelname[workshop]">workshop</label>
Dan hoef je maar één kapstok te inspecteren, in plaats van X kapstokken.
Tenzij je dus één specifieke opleiding selecteert, en daarnaast een andere (specifieke) cursus en mogelijk ook weer een andere (specifieke) workshop. Dan zijn dropdowns mogelijk meer op zijn plaats.
NB de aanpak met array_filter() lijkt een beetje op een hack? De isset() is een beetje een wassen neus en mogelijk bestaat $_POST['keuzes'] niet, afhankelijk van hoe je dit in HTML aanzwengelt, dus dat levert je dan mogelijk nog steeds een notice op / is het nogal onvoorspelbaar wat array_filter() retourneert?
Toevoeging op 02/03/2020 19:35:22:
Ik heb nu dit:
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
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="" method="POST">
Keuze 1: <select name="choices['opleiding']">
<option value="">-</option>
<option value="pedicure">Pedicure</option>
<option value="manicure">Manicure</option>
</select><br>
Keuze 2: <select name="choices['cursus']">
<option value="">-</option>
<option value="cursus maseren">Maseren</option>
<option value="cursus voetmasage">voetmasage</option>
</select><br>
Keuze 3: <select name="choices['workshop']">
<option value="">-</option>
<option value="workshop 1 dag">1 dag</option>
<option value="workshop 2 dagen">2 dagen</option>
</select><br>
<input type="submit" name="submit" value="Verstuur"><br>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])){
$choices = array_filter($_POST['choices']);
if(!empty($choices) && count($choices) > 0) {
echo json_encode($choices);
} else {
echo 'No choice is made, make atleast 1!';
}
}
?>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="" method="POST">
Keuze 1: <select name="choices['opleiding']">
<option value="">-</option>
<option value="pedicure">Pedicure</option>
<option value="manicure">Manicure</option>
</select><br>
Keuze 2: <select name="choices['cursus']">
<option value="">-</option>
<option value="cursus maseren">Maseren</option>
<option value="cursus voetmasage">voetmasage</option>
</select><br>
Keuze 3: <select name="choices['workshop']">
<option value="">-</option>
<option value="workshop 1 dag">1 dag</option>
<option value="workshop 2 dagen">2 dagen</option>
</select><br>
<input type="submit" name="submit" value="Verstuur"><br>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])){
$choices = array_filter($_POST['choices']);
if(!empty($choices) && count($choices) > 0) {
echo json_encode($choices);
} else {
echo 'No choice is made, make atleast 1!';
}
}
?>
Dit werkt prima, alleen vraag ik me af of het wel de beste manier is om in een 'selecteer tenminste 1 van de 3' situatie is?
Gewijzigd op 02/03/2020 19:45:24 door Jorn Reed
EDIT: als je een soort van formuliersysteem zou hebben waarbij je per veld valideert zou je hiervoor een extra custom validatie voor moeten maken ofzo, maar als dit een standalone formulier is dan is het prima zo.
Gewijzigd op 03/03/2020 00:54:59 door Thomas van den Heuvel
Ja die quotes zijn weg haha. Voor de rest werkt dit prima. Als er minimaal 1 veld is geselecteerd word het formulier verzonden, ook als ze alle 3 zijn ingevuld. Dus ik ben blij haha. Dat `json_encode` was puur om even de array te echoen.
Of een formulier verzonden is controleer je niet met if(isset($_POST['submit'])){ maar met if($_SERVER['REQUEST_METHOD'] == "POST") {