Weet iemand hoe je ervoor kunt zorgen dat het volgende kan:

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.
Waar loop je vast? Formulier, verwerken input, opslaan in database, ......?
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.
checkboxen dienen dan dus een value te hebben die aangeeft om welke checkbox het gaat.

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?


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.

users:
- id
- name
- email
...

options:
- id
- description

users_options
- user_id
- option_id


Welke checkboxen staan aan voor user met id 123?

SELECT
	option_id
FROM
	users_options
WHERE
	user_id=123


Of als je ook de omschrijving van de optie er bij wilt hebben:

SELECT
	o.id, o.description
FROM
	users_options uo
JOIN
	options o ON o.id = uo.option_id
WHERE
	uo.user_id=123
index.php

<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

<?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";
}
?>


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 :)
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

[size=xsmall]Toevoeging op 16/07/2016 14:19:49:[/size]

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

[size=xsmall]Toevoeging op 16/07/2016 14:19:49:[/size]

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?
- Waarom gebruik je checkboxes voor male/female en geen radiobuttons? Nu kun je namelijk opgeven dat je zowel man EN vrouw bent ... (wellicht een ongelukkig gekozen voorbeeld?)

dan valt me dit stukje code op:
<?php

if (isset($_POST['male'])){
$male= 1;
}
else {
$male= 0;
}

if (isset($_POST['female'])){
$female= 1;
}
else {
$female= 0;
}
?>

Als je dat nu eens zo deed?
<?php

// initialisatie
$male= 0;
$female= 0;

if (isset($_POST['male'])){
$male= 1;
}

if (isset($_POST['female'])){
$female= 1;
}
?>

Dan als het inderdaad een keuze tussen male en female moet zijn dan zou ik dat ook zo in de database zetten:

<input type="radio" name="gender" value="M" /> Male<br>
<input type="radio" name="gender" value="F" /> Female<br>

<?php

// 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).


[size=xsmall]Toevoeging op 16/07/2016 15:25:41:[/size]

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'!

[size=xsmall]Toevoeging op 16/07/2016 15:30:46:[/size]

<?php
if(!isset($_POST['gender']) || !in_array($_POST['gender'], array('M', 'F')))
{
// ERROR!
}
?>

[size=xsmall]Toevoeging op 16/07/2016 15:41:45:[/size]

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


<?php

// 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).


[size=xsmall]Toevoeging op 16/07/2016 15:25:41:[/size]

[quote="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'!

[size=xsmall]Toevoeging op 16/07/2016 15:30:46:[/size]

<?php
if(!isset($_POST['gender']) || !in_array($_POST['gender'], array('M', 'F')))
{
// ERROR!
}
?>

[size=xsmall]Toevoeging op 16/07/2016 15:41:45:[/size]

Tot slot nog even een interessant artikel: https://www.smashingmagazine.com/2009/07/web-form-validation-best-practices-and-tutorials/
[/quote]

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.

Reageren