Checkboxen opslaan in de database
Als je een form hebt gemaakt met checkboxen (bijvoorbeeld 6 verschillende checkboxen)
en je selecteert de 1e dus 0 en nummer 5 dat dan in de database de nummers 05 komen te staan in 1 vakje en de ander 6 niet.
Gewijzigd op 16/07/2016 22:26:19 door - Ariën -
Edit:
Zou je jouw bericht willen bewerken en een topictitel invullen die je vraag- of probleemstelling omschrijft?
Alvast bedankt!
Alvast bedankt!
Overigens vraag ik me af of het verstandig is op de aangevinkte checkboxen zo op te slaan in een database. Waarom in 1 veld?
Mogelijke gotcha: niet-gecheckte checkboxen worden in het geheel niet gePOST, en bestaan dus ook niet in $_POST.
Of het handig is om het resultaat in 1 veld op te slaan, is een ander punt.
Want hoe check je of iemand checkbox 4 had aangevinkt? (WHERE veld LIKE '%4%' klinkt niet heel efficient)
En wat te doen als je meer dan 9 checkboxen hebt?
Ivo P op 15/07/2016 09:32:05:
Of het handig is om het resultaat in 1 veld op te slaan, is een ander punt.
Want hoe check je of iemand checkbox 4 had aangevinkt? (WHERE veld LIKE '%4%' klinkt niet heel efficient)
En wat te doen als je meer dan 9 checkboxen hebt?
Want hoe check je of iemand checkbox 4 had aangevinkt? (WHERE veld LIKE '%4%' klinkt niet heel efficient)
En wat te doen als je meer dan 9 checkboxen hebt?
Precies daarom is een verzameling van checkboxen een goede reden om wat extra tabellen aan te maken in de database. Stel een user kan een paar opties aan of uit schakelen. Je hebt dan de tabel users, een tabel options en daarnaast maak je een koppeltabel users_options.
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
users:
- id
- name
- email
...
options:
- id
- description
users_options
- user_id
- option_id
- id
- name
...
options:
- id
- description
users_options
- user_id
- option_id
Welke checkboxen staan aan voor user met id 123?
Of als je ook de omschrijving van de optie er bij wilt hebben:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
o.id, o.description
FROM
users_options uo
JOIN
options o ON o.id = uo.option_id
WHERE
uo.user_id=123
o.id, o.description
FROM
users_options uo
JOIN
options o ON o.id = uo.option_id
WHERE
uo.user_id=123
Gewijzigd op 15/07/2016 21:00:02 door Frank Nietbelangrijk
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
<html>
<head>
</head>
<body>
<form action="inserted.php" method="POST">
Fname : <input type="text" name="fname"><br>
Lname : <input type="text" name="lname"><br>
check0: <input type="checkbox" name="male" value="m">
check1: <input type="checkbox" name="female" value="f">
<input type="submit" name="submit" value="add">
</form>
</body>
</html>
<head>
</head>
<body>
<form action="inserted.php" method="POST">
Fname : <input type="text" name="fname"><br>
Lname : <input type="text" name="lname"><br>
check0: <input type="checkbox" name="male" value="m">
check1: <input type="checkbox" name="female" value="f">
<input type="submit" name="submit" value="add">
</form>
</body>
</html>
inserted.php
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
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
<?php
$fname=$_POST['fname'];
$lname=$_POST['lname'];
if (isset($_POST['male'])){
$male= 1;
}
else {
$male= 0;
}
if (isset($_POST['female'])){
$female= 1;
}
else {
$female= 0;
}
mysql_connect("localhost", "root", "");
mysql_select_db("user");
$select="insert into project (fname,lname,male,female) values ('".$fname."','".$lname."','".$male."','".$female."')";
$sql=mysql_query($select);
if ($sql == true){
echo "succesfully";
}
else {
echo "failed";
}
?>
$fname=$_POST['fname'];
$lname=$_POST['lname'];
if (isset($_POST['male'])){
$male= 1;
}
else {
$male= 0;
}
if (isset($_POST['female'])){
$female= 1;
}
else {
$female= 0;
}
mysql_connect("localhost", "root", "");
mysql_select_db("user");
$select="insert into project (fname,lname,male,female) values ('".$fname."','".$lname."','".$male."','".$female."')";
$sql=mysql_query($select);
if ($sql == true){
echo "succesfully";
}
else {
echo "failed";
}
?>
Hoe ik het nu heb werkt het, maar ik weet wel zeker dat mijn code verbeterd kan worden.
Graag tips met uitleg zodat ik het snap :)
check0: <input type="radio" name="geslacht" value="m">
check1: <input type="radio" name="geslacht" value="f">
en dan opslaan in de kolom geslacht middels m of f
of eventueel middels 1 of 0 danwel 1 of 2 en 0 voor niet-gegeven
In jouw script kan iemand zowel m als f aanvinken
Toevoeging op 16/07/2016 14:19:49:
en dan nog afvangen dat iemand ook o'malley kan heten.
http://wiki.pfz.nl/sql-injectie
Ivo P op 16/07/2016 14:18:57:
in de meeste gevallen is iemand male of female qua geslacht. Als het hier daarom gaat:
check0: <input type="radio" name="geslacht" value="m">
check1: <input type="radio" name="geslacht" value="f">
en dan opslaan in de kolom geslacht middels m of f
of eventueel middels 1 of 0 danwel 1 of 2 en 0 voor niet-gegeven
In jouw script kan iemand zowel m als f aanvinken
Toevoeging op 16/07/2016 14:19:49:
en dan nog afvangen dat iemand ook o'malley kan heten.
http://wiki.pfz.nl/sql-injectie
check0: <input type="radio" name="geslacht" value="m">
check1: <input type="radio" name="geslacht" value="f">
en dan opslaan in de kolom geslacht middels m of f
of eventueel middels 1 of 0 danwel 1 of 2 en 0 voor niet-gegeven
In jouw script kan iemand zowel m als f aanvinken
Toevoeging op 16/07/2016 14:19:49:
en dan nog afvangen dat iemand ook o'malley kan heten.
http://wiki.pfz.nl/sql-injectie
Het ging meer om dat het werkte niet perse om de inhoud ervan en je bedoeld dat ik real escape strings moet gaan gebruiken?
dan valt me dit stukje code op:
Code (php)
Als je dat nu eens zo deed?
Code (php)
Dan als het inderdaad een keuze tussen male en female moet zijn dan zou ik dat ook zo in de database zetten:
Code (php)
1
2
2
<input type="radio" name="gender" value="M" /> Male<br>
<input type="radio" name="gender" value="F" /> Female<br>
<input type="radio" name="gender" value="F" /> Female<br>
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
// query
$sql = "insert into project (fname,lname,gender) values ('".$fname."','".$lname."','".$gender."')";
...
?>
// query
$sql = "insert into project (fname,lname,gender) values ('".$fname."','".$lname."','".$gender."')";
...
?>
De mysql_ functies worden door de meest recente PHP versie NIET MEER ondersteund wat wil zeggen dat deze functies dan NIET MEER WERKEN. Stap dus direct over op mysqli_ functies (of op PDO).
Toevoeging op 16/07/2016 15:25:41:
Marcel Groot op 16/07/2016 14:32:33:
Het ging meer om dat het werkte niet perse om de inhoud ervan en je bedoeld dat ik real escape strings moet gaan gebruiken?
Het gaat niet alleen om mysql injectie of om real escape strings (mysqli_real_escape_string).
Je moet beseffen dat GET en POST variabelen random meegestuurd kunnen worden in ieder request en dat jij ze altijd moet controleren op hun geldigheid en juistheid. zo is het heel erg simpel om in plaats van een F of M een andere letter(reeks) mee te posten. Dus waar jij nu misschien braaf een F of M verwacht in $_POST['gender'] kan deze net zo goed geheel afwezig zijn of een andere waarde bevatten. CONTROLEER HIER ZO VEEL MOGELIJK OP.
ALLE INPUT VAN BUITEN JE APPLICATIE IS 'VUIL'!
Toevoeging op 16/07/2016 15:30:46:
Code (php)
Toevoeging op 16/07/2016 15:41:45:
Tot slot nog even een interessant artikel: https://www.smashingmagazine.com/2009/07/web-form-validation-best-practices-and-tutorials/
Frank Nietbelangrijk op 16/07/2016 15:14:56:
De mysql_ functies worden door de meest recente PHP versie NIET MEER ondersteund wat wil zeggen dat deze functies dan NIET MEER WERKEN. Stap dus direct over op mysqli_ functies (of op PDO).
Toevoeging op 16/07/2016 15:25:41:
Het gaat niet alleen om mysql injectie of om real escape strings (mysqli_real_escape_string).
Je moet beseffen dat GET en POST variabelen random meegestuurd kunnen worden in ieder request en dat jij ze altijd moet controleren op hun geldigheid en juistheid. zo is het heel erg simpel om in plaats van een F of M een andere letter(reeks) mee te posten. Dus waar jij nu misschien braaf een F of M verwacht in $_POST['gender'] kan deze net zo goed geheel afwezig zijn of een andere waarde bevatten. CONTROLEER HIER ZO VEEL MOGELIJK OP.
ALLE INPUT VAN BUITEN JE APPLICATIE IS 'VUIL'!
Toevoeging op 16/07/2016 15:30:46:
Toevoeging op 16/07/2016 15:41:45:
Tot slot nog even een interessant artikel: https://www.smashingmagazine.com/2009/07/web-form-validation-best-practices-and-tutorials/
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
// query
$sql = "insert into project (fname,lname,gender) values ('".$fname."','".$lname."','".$gender."')";
...
?>
// query
$sql = "insert into project (fname,lname,gender) values ('".$fname."','".$lname."','".$gender."')";
...
?>
De mysql_ functies worden door de meest recente PHP versie NIET MEER ondersteund wat wil zeggen dat deze functies dan NIET MEER WERKEN. Stap dus direct over op mysqli_ functies (of op PDO).
Toevoeging op 16/07/2016 15:25:41:
Marcel Groot op 16/07/2016 14:32:33:
Het ging meer om dat het werkte niet perse om de inhoud ervan en je bedoeld dat ik real escape strings moet gaan gebruiken?
Het gaat niet alleen om mysql injectie of om real escape strings (mysqli_real_escape_string).
Je moet beseffen dat GET en POST variabelen random meegestuurd kunnen worden in ieder request en dat jij ze altijd moet controleren op hun geldigheid en juistheid. zo is het heel erg simpel om in plaats van een F of M een andere letter(reeks) mee te posten. Dus waar jij nu misschien braaf een F of M verwacht in $_POST['gender'] kan deze net zo goed geheel afwezig zijn of een andere waarde bevatten. CONTROLEER HIER ZO VEEL MOGELIJK OP.
ALLE INPUT VAN BUITEN JE APPLICATIE IS 'VUIL'!
Toevoeging op 16/07/2016 15:30:46:
Code (php)
Toevoeging op 16/07/2016 15:41:45:
Tot slot nog even een interessant artikel: https://www.smashingmagazine.com/2009/07/web-form-validation-best-practices-and-tutorials/
En wat als je er voor zorgt dat het formulier alleen kan worden verzonden als er alleen gebruik is gemaakt van letters en cijfers? Dus wanneer er een % of # (enzv....) wordt gebruikt het formulier gewoon niet wordt verzonden.
Complete reacties quoten is doorgaans niet zinvol, maakt het topic onnodig lang en lastig te lezen.
Hoe wil jij voorkomen dat een formulier wordt verzonden als er niet alleen letters /cijfers zijn gebruikt?
En wat als iemand jansen-de vries heet?
Offtopic:
Als je direct op iemand reageert dan is het niet nodig om diegene te quoten. Dat maakt het erg onduidelijk. Aub alleen quoten wanneer je reageert op een eerdere reactie.
Toevoeging op 16/07/2016 21:42:59:
Oh, haha Obelix en Idefix was (waren) me voor :-)
Edit:
Topictitel aangepast naar: Checkboxen opslaan in de database.
Gelieve zelf in het vervolg een goede duidelijke topictitel meegeven.
Gelieve zelf in het vervolg een goede duidelijke topictitel meegeven.
ISO/IEC 5218, Information technology — Codes for the representation of human sexes, kent vier codes voor het geslacht:
0 = not known
1 = male
2 = female
9 = not applicable
De norm 0 = not known
1 = male
2 = female
9 = not applicable
Die controle zou zoals je hem hier beschrijft, veel te bot zijn. Inderdaad: Jansen-de vries zou al zowel een "-" als een spatie toevoegen aan je lijst.
Daarna blijkt François Röntgen zijn naam niet te kunnen invoeren. En toen je een lijstje had gemaakt van alle streepjes en puntjes op de verschillende klinkers (é ò ü) bleken er nog dakjes te zijn en de ñ om over al die oost-europese accenten nog maar te zwijgen.
Zo blijf je er achteraan rennen afhankelijk van je doelgroep.
En ook het teken dat eigenlijk het schadelijkste is voor je query, de apostrof, kun je niet uitsluiten, want Jeanne d'Arc en o'malley zijn geldige namen.
Veel eenvoudiger is het om gewoon te zorgen dat je query's beveiligd worden.
En aangezien je toch nog van mysql-functies over moet stappen, is dat misschien een mooi moment om prepared statements te gaan gebruiken.