Checkboxen opslaan in de database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marcel Groot

Marcel Groot

14/07/2016 21:00:10
Quote Anchor link
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.
Gewijzigd op 16/07/2016 22:26:19 door - Ariën -
 
PHP hulp

PHP hulp

23/12/2024 00:26:44
 
- Ariën  -
Beheerder

- Ariën -

14/07/2016 21:06:34
Quote Anchor link
Edit:
Zou je jouw bericht willen bewerken en een topictitel invullen die je vraag- of probleemstelling omschrijft?
Alvast bedankt!
 
Obelix Idefix

Obelix Idefix

14/07/2016 21:33:42
Quote Anchor link
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?
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2016 23:56:25
Quote Anchor link
Mogelijke gotcha: niet-gecheckte checkboxen worden in het geheel niet gePOST, en bestaan dus ook niet in $_POST.
 
Ivo P

Ivo P

15/07/2016 09:32:05
Quote Anchor link
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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

15/07/2016 20:55:19
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Welke checkboxen staan aan voor user met id 123?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
    option_id
FROM
    users_options
WHERE
    user_id=123


Of als je ook de omschrijving van de optie er bij wilt hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 15/07/2016 21:00:02 door Frank Nietbelangrijk
 
Marcel Groot

Marcel Groot

16/07/2016 13:58:24
Quote Anchor link
index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

inserted.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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 :)
 
Ivo P

Ivo P

16/07/2016 14:18:57
Quote Anchor link
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
 
Marcel Groot

Marcel Groot

16/07/2016 14:32:33
Quote Anchor link
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


Het ging meer om dat het werkte niet perse om de inhoud ervan en je bedoeld dat ik real escape strings moet gaan gebruiken?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

16/07/2016 15:14:56
Quote Anchor link
- 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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<input type="radio" name="gender" value="M" /> Male<br>
<input type="radio" name="gender" value="F" /> Female<br>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?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).


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!isset($_POST['gender']) || !in_array($_POST['gender'], array('M', 'F')))
{

    // ERROR!
}
?>


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/
 
Marcel Groot

Marcel Groot

16/07/2016 20:32:45
Quote Anchor link
Frank Nietbelangrijk op 16/07/2016 15:14:56:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?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).


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!isset($_POST['gender']) || !in_array($_POST['gender'], array('M', 'F')))
{

    // ERROR!
}
?>


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.
 
Obelix Idefix

Obelix Idefix

16/07/2016 21:39:20
Quote Anchor link
Quote aub alleen als het nodig is / wat relevant is.
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?
 
Ozzie PHP

Ozzie PHP

16/07/2016 21:42:14
Quote Anchor link
Die controle kun je niet doen. Als iemand javascript uitgeschakeld heeft dan zal het formulier alsnog verzonden worden. Je moet sowieso dus altijd alles op server-niveau controleren.

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 :-)
 
- Ariën  -
Beheerder

- Ariën -

16/07/2016 22:27:17
Quote Anchor link
Edit:
Topictitel aangepast naar: Checkboxen opslaan in de database.
Gelieve zelf in het vervolg een goede duidelijke topictitel meegeven.
 
Ward van der Put
Moderator

Ward van der Put

17/07/2016 11:37:37
Quote Anchor link
De norm 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
 
Ivo P

Ivo P

18/07/2016 10:14:26
Quote Anchor link
"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. "

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.