[PHP][MYSQL] checkbox koppeling met database niet volledig

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • blackspeedy
  • Registratie: Juni 2011
  • Laatst online: 22:46
Beste Tweakeraars ik heb weer een probleem en jullie hebben waarschijnlijk meer kennis op dit gebied dan mij.

Ik moet een webshop maken voor een project.
Nu wil ik de categorieën filteren met checkboxen. Nu heb ik dat gedaan, alleen als ik meerder checkboxen aan wil vinken werkt dat natuurlijk niet omdat hij maar 1 id kan verwerken zoals de query code nu is.
Nu wil ik het met deze query code doen: SELECT * FROM telefoon WHERE cat_id in (1,2,3)
Maar ik zou niet weten hoe ik het tussen de haakjes en comma's moet zetten binnen de loop.

Ik hoop dat het zo een beetje duidelijk is.


PHP: filename
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
<body>

<form action=" " method="GET" id="filter">
<br><input type="checkbox" name="telefoon[]" value="1">Apple<br>
<input type="checkbox" name="telefoon[]" value="2">Samsung<br>
<input type="checkbox" name="telefoon[]" value="3">HTC<br>
<input type="checkbox" name="telefoon[]" value="4">Nokia<br>

<input type="submit" name="kies" value="Submit" />
</form>

<?php
            foreach($_GET['telefoon'] as $catid)
            {
                if(isset($_GET['telefoon'] ))
                    {
                        $query = mysql_query ("SELECT * FROM telefoon WHERE cat_id =".$catid);
                    }
                    else 
                    {
                        $query = mysql_query ("SELECT * FROM telefoon");
                    }
            }
            while ($row = mysql_fetch_assoc($query))
            {
                $merk = $row['merk'];
                
                echo $merk . "<br>";
            }
            
?>
</body>

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 08-09 15:03

Douweegbertje

Wat kinderachtig.. godverdomme

Je kunt gewoon het volgende doen. Ongeacht of er nu één of meerdere items in zitten. Geen foreach dus.

PHP:
1
2
3
4
if($_GET['telefoon'] && count($_GET['telefoon'] > 0)
{
    $query = mysql_query ("SELECT * FROM telefoon WHERE cat_id in ($_GET['telefoon']))"; 
}

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^ en dan hou je natuurlijk wel rekening met SQL injection...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 08-09 21:43
RobIII schreef op maandag 07 april 2014 @ 17:24:
^ en dan hou je natuurlijk wel rekening met SQL injection...
Ik zou inderdaad maar even wat escapen of overstappen naar PDO.

Verder is mysql_query() toch deprecated?

Acties:
  • 0 Henk 'm!

  • blackspeedy
  • Registratie: Juni 2011
  • Laatst online: 22:46
Douweegbertje schreef op maandag 07 april 2014 @ 17:22:
Je kunt gewoon het volgende doen. Ongeacht of er nu één of meerdere items in zitten. Geen foreach dus.

PHP:
1
2
3
4
if($_GET['telefoon'] && count($_GET['telefoon'] > 0)
{
    $query = mysql_query ("SELECT * FROM telefoon WHERE cat_id in ($_GET['telefoon']))"; 
}
Dit is inderdaad is stuk makkelijker en overzichtelijker :)
Maar hij klopt nog niet volgens mij, omdat de query niet goed is.

Als ik er nu meerder zou selecteren komt hij in feiten zo te staan (WHERE cat_id in 1234) en er moeten nog comma's tussen anders pakt hij hem niet.

Over de SQL injections, hij komt niet online dit is een project voor school.

Bedankt voor de snelle reacties trouwens :)

Iemand nog meer ideeën?

Acties:
  • 0 Henk 'm!

  • DogEatsDog
  • Registratie: December 2010
  • Laatst online: 08:54
blackspeedy schreef op maandag 07 april 2014 @ 17:58:
[...]


Dit is inderdaad is stuk makkelijker en overzichtelijker :)
Maar hij klopt nog niet volgens mij, omdat de query niet goed is.

Als ik er nu meerder zou selecteren komt hij in feiten zo te staan (WHERE cat_id in 1234) en er moeten nog comma's tussen anders pakt hij hem niet.

Over de SQL injections, hij komt niet online dit is een project voor school.

Bedankt voor de snelle reacties trouwens :)

Iemand nog meer ideeën?
Dan kun je de string van categorieën van tevoren imploden() met een komma als delimeter.
Overigens is het good practice om ongeacht het doel van het project alles veilig te maken. Zo raak je er aan gewend en wordt het een automatisme.

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 08-09 15:03

Douweegbertje

Wat kinderachtig.. godverdomme

blackspeedy schreef op maandag 07 april 2014 @ 17:58:
[...]


Dit is inderdaad is stuk makkelijker en overzichtelijker :)
Maar hij klopt nog niet volgens mij, omdat de query niet goed is.

Als ik er nu meerder zou selecteren komt hij in feiten zo te staan (WHERE cat_id in 1234) en er moeten nog comma's tussen anders pakt hij hem niet.

Over de SQL injections, hij komt niet online dit is een project voor school.

Bedankt voor de snelle reacties trouwens :)

Iemand nog meer ideeën?
eh ja, even vergeten :+

Zoals werd gezegd kun je imploden met een , zoals

PHP:
1
$catid =  implode(',', $_GET['telefoon']);


of

PHP:
1
$catid = join(',',$_GET['telefoon']);


en dan de $_GET['telefoon'] vervangen door $catid


En juist omdat het voor school is zou je eens moeten nadenken over veiligheid imo. Ten eerste is zoals eerder al gezegd mysql vrijwel uitgefaseerd. Daar zijn dus weer andere oplossingen voor zoals mysqli en PDO . Het is niet verkeerd om PDO eens te proberen aangezien het vrij simpel is en naar mijn mening voor beginners zelfs makkelijker dan de standaard mysql.

[ Voor 18% gewijzigd door Douweegbertje op 07-04-2014 18:08 ]


Acties:
  • 0 Henk 'm!

  • blackspeedy
  • Registratie: Juni 2011
  • Laatst online: 22:46
Hier heb ik hem nu werkende. Hij gaf een fout melding als ik er geen variable van deed maken of ik moest hem voor de $_GET afsluiten met " alleen dan werkte de code niet.

<body>
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
<form action=" " method="GET" id="filter">
<br><input type="checkbox" name="telefoon[]" value="1">Apple<br>
<input type="checkbox" name="telefoon[]" value="2">Samsung<br>
<input type="checkbox" name="telefoon[]" value="3">HTC<br>
<input type="checkbox" name="telefoon[]" value="4">Nokia<br>
<input type="submit" name="kies" value="Submit" />
</form>

<?php
            

            if($_GET['telefoon'] && count($_GET['telefoon'] > 0)) 
            { 
                $catid =  implode(',', $_GET['telefoon']); 
                $catfilter = $catid;
                
                $query = mysql_query ("SELECT * FROM telefoon WHERE cat_id in ($catfilter)");
            } 
            while ($row = mysql_fetch_assoc($query))
            {
                $id = $row['id'];
                $omschrijving = $row['omschrijving'];
                $prijs = $row['prijs'];
                $afb = $row['afb_url'];
                $merk = $row['merk'];
                
                echo $merk . "<br>";
            }


Nu zal ik ook even kijken naar dat PDO ik heb er eerlijk gezegd nog nooit van gehoord. Ik weet natuurlijk wel dat je het allemaal moet beveiligen alleen nog niet zover gekomen.

in ieder geval erg bedankt! En weer wat nieuws geleerd.

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 08-09 15:03

Douweegbertje

Wat kinderachtig.. godverdomme

PDO is eigenlijk een DB extensie, dus het kan zijn dat je eventueel een PHP/MySQL driver moet 'installeren'. De "PDO_MYSQL" driver.

Vervolgens is eigenlijk alles klaar en kun je er direct gebruik van maken (mocht je de driver al niet hebben).
Doe gewoon even het volgende, en je ziet het gelijk:
PHP:
1
print_r(PDO::getAvailableDrivers());


Heel het punt is dat je sql statements "prepared" oftewel voorbereid op data. Even een simpel voorbeeld.

SELECT * FROM blaat WHERE x = IETS.

Nu in het geval met PDO, bereidt je deze statement voor, door te zeggen dat IETS een variabele is, en letterlijk alleen daar. Je kunt ook zeggen of het perse een INT of een string of w/e moet zijn. Zodoende kun je het beveiligen met goede data, en niet met x)"; SELECT * FROM USERS-- wat dus een injectie is om even al je users te pakken :) (zal wel niet werken, even snel neer gezet).

Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
Heb even een paar dingetjes voor je verbeterd:

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
<form action="#" method="GET" id="filter"> <!-- Iéts netter met tabs gezet. Tevens <br> vervangen naar <br /> -->
    <input type="checkbox" name="telefoon[]" value="1">Apple<br /> 
    <input type="checkbox" name="telefoon[]" value="2">Samsung<br /> 
    <input type="checkbox" name="telefoon[]" value="3">HTC<br /> 
    <input type="checkbox" name="telefoon[]" value="4">Nokia<br /> 
    <input type="submit" name="kies" value="Kies" /> 
</form> 

<?php 
if(isset($_GET['telefoon']) && count($_GET['telefoon'] > 0)) { // Isset functie is even iets netter om te controleren of 'telefoon' bestaat
    $catid = implode(',', $_GET['telefoon']);
    $catid = mysql_real_escape_string($catid); // MySQL injectie preventie
    
    $query = mysql_query("SELECT * FROM telefoon WHERE cat_id IN (".$catid.")"); // $catfilter veranderd naar $catid en even tussen haakjes gezet
    
    while($row = mysql_fetch_assoc($query)) { // While in if-functie gezet, anders krijg je foutmeldingen als je geen 'telefoon' meegeeft
        $id = $row['id']; 
        $omschrijving = $row['omschrijving']; 
        $prijs = $row['prijs']; 
        $afb = $row['afb_url']; 
        $merk = $row['merk']; 
         
        echo $merk . "<br />"; 
    }
}
?>


Bij de comments staat wat ik heb veranderd.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
blackspeedy schreef op maandag 07 april 2014 @ 17:58:
Over de SQL injections, hij komt niet online dit is een project voor school.
Famous last words ;)
Escapen doe je per definitie altijd-en-overal(-waar-dat-technisch-nodig-is). "Het is maar voor intern gebruik op school / op de zaak / voor mezelf" is gewoon een kutsmoes. Voor je 't weet heb je een collega / medeleerling die even gaat lopen 'testen' en *floep* je DB foetsie of meuk "op straat" die daar niet hoort. Of je project groeit uit tot iets bruikbaars en gaat breder gebruikt worden dan initieel het idee was of... Dit soort zaken voeg je metéén, bij 't bouwen, toe. Niet achteraf. Dat komt er nooit (meer) van of je vergeet 1 of 2 plekkies als je het achteraf gaat toevoegen en vroeg-of-laat ben je alsnog de pineut.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 10-09 09:31

EnnaN

Toys in the attic

Verder: als het een project is voor school ga ik er van uit dat je daar een cijfer voor krijgt? Waarom zou je dan bewust er nu voor kiezen goede, makkelijk te implementeren dingen niet te doen, zodat je bewust een slechtere code overhoudt?

Maar er staat hierboven nog iets: de code die je gebruikt is deprecated. Dat staat ook vrij groot in de manual die je vast gezien hebt : http://nl3.php.net/mysql_query
Warning
This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:
mysqli_query()
PDO::query()

sig


Acties:
  • 0 Henk 'm!

  • blackspeedy
  • Registratie: Juni 2011
  • Laatst online: 22:46
andydewit schreef op dinsdag 08 april 2014 @ 18:13:
Heb even een paar dingetjes voor je verbeterd:

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
<form action="#" method="GET" id="filter"> <!-- Iéts netter met tabs gezet. Tevens <br> vervangen naar <br /> -->
    <input type="checkbox" name="telefoon[]" value="1">Apple<br /> 
    <input type="checkbox" name="telefoon[]" value="2">Samsung<br /> 
    <input type="checkbox" name="telefoon[]" value="3">HTC<br /> 
    <input type="checkbox" name="telefoon[]" value="4">Nokia<br /> 
    <input type="submit" name="kies" value="Kies" /> 
</form> 

<?php 
if(isset($_GET['telefoon']) && count($_GET['telefoon'] > 0)) { // Isset functie is even iets netter om te controleren of 'telefoon' bestaat
    $catid = implode(',', $_GET['telefoon']);
    $catid = mysql_real_escape_string($catid); // MySQL injectie preventie
    
    $query = mysql_query("SELECT * FROM telefoon WHERE cat_id IN (".$catid.")"); // $catfilter veranderd naar $catid en even tussen haakjes gezet
    
    while($row = mysql_fetch_assoc($query)) { // While in if-functie gezet, anders krijg je foutmeldingen als je geen 'telefoon' meegeeft
        $id = $row['id']; 
        $omschrijving = $row['omschrijving']; 
        $prijs = $row['prijs']; 
        $afb = $row['afb_url']; 
        $merk = $row['merk']; 
         
        echo $merk . "<br />"; 
    }
}
?>


Bij de comments staat wat ik heb veranderd.
Kijk bedankt! Dit soort dingen steek ik te minsten wat van op, die code die ik gebruik is deels uit een boek en dan ben je al blij als het werkt:) Dit is nu het tweede project en begin er al een stuk handiger in te worden :)
RobIII schreef op dinsdag 08 april 2014 @ 19:23:
[...]

Famous last words ;)
Escapen doe je per definitie altijd-en-overal(-waar-dat-technisch-nodig-is). "Het is maar voor intern gebruik op school / op de zaak / voor mezelf" is gewoon een kutsmoes. Voor je 't weet heb je een collega / medeleerling die even gaat lopen 'testen' en *floep* je DB foetsie of meuk "op straat" die daar niet hoort. Of je project groeit uit tot iets bruikbaars en gaat breder gebruikt worden dan initieel het idee was of... Dit soort zaken voeg je metéén, bij 't bouwen, toe. Niet achteraf. Dat komt er nooit (meer) van of je vergeet 1 of 2 plekkies als je het achteraf gaat toevoegen en vroeg-of-laat ben je alsnog de pineut.
Eigenlijk is de rede dat ik echt nog niet weet waar ik precies op moet letten en hoe je er mee om moet gaan. Ik heb het ook nog niet gekregen op school, en buiten school om ook nog geen tijd gehad om er in te verdiepen. Ik zit nu in de vierde periode en ik heb nu html5,css3,php,java(beetje),C# en database gekregen. Dus moet wel goed mijn best doen alles loopt mij wel goed af alleen C# is toch weer heel wat anders.
EnnaN schreef op dinsdag 08 april 2014 @ 19:32:
Verder: als het een project is voor school ga ik er van uit dat je daar een cijfer voor krijgt? Waarom zou je dan bewust er nu voor kiezen goede, makkelijk te implementeren dingen niet te doen, zodat je bewust een slechtere code overhoudt?

Maar er staat hierboven nog iets: de code die je gebruikt is deprecated. Dat staat ook vrij groot in de manual die je vast gezien hebt : http://nl3.php.net/mysql_query

[...]
Ja klopt, ik krijg er inderdaad een cijfer voor. Grotendeels wordt er gekeken naar de communicatie met de "klant" maar ik denk dat er met dit project ook meer naar de code wordt gekeken, hoop ik wel in ieder geval.. Verder dat de code deprecated is geloof ik je graag:) ik ga alles wat jullie hebben gezegd nog even goed doornemen en invoegen in het project, maar vooral alles goed opnemen voor in de toekomst :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

blackspeedy schreef op dinsdag 08 april 2014 @ 21:39:
[...]

Eigenlijk is de rede dat ik echt nog niet weet waar ik precies op moet letten en hoe je er mee om moet gaan. Ik heb het ook nog niet gekregen op school, en buiten school om ook nog geen tijd gehad om er in te verdiepen. Ik zit nu in de vierde periode en ik heb nu html5,css3,php,java(beetje),C# en database gekregen. Dus moet wel goed mijn best doen alles loopt mij wel goed af alleen C# is toch weer heel wat anders.
SQL-injectie voorkomen is geen rocket science. Ik begrijp dat het allemaal wat veel is voor een beginnende programmeur maar als je je dit soort dingen niet vanaf dag 1 goed aanleert loop je het risico dat je de verkeerde dingen in je hoofd krijgt en probeer dat er maar eens uit te krijgen zonder er een keer keihard je hoofd aan te stoten. ;)

Voor informatie over wat SQL-injectie is kun je reviews: Sql-injectie en xss: de beste verdediging eens lezen. De meest basale techniek om het te voorkomen vind je in de PHP-handleiding en de alom meest geaccepteerde manier om SQL-injectie te voorkomen (hoewel dat slechts een bijproduct is van het échte doel van de module) is PDO of iets vergelijkbaars. Domweg mysqli_real_escape_string gebruiken om alles wat in je query belandt veilig te maken is in principe doorgaans al voldoende en zal mogelijk zelfs je punten wat opkrikken, afhankelijk van of je leraar al dan niet weet waar 'ie het over heeft. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 08-09 21:43
blackspeedy schreef op dinsdag 08 april 2014 @ 21:39:
Dus moet wel goed mijn best doen alles loopt mij wel goed af alleen C# is toch weer heel wat anders.
Met 'anders' bedoel je 'mooier', toch? ;)

Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
Wat misschien ook handig is, is de volgende code:

PHP:
1
error_reporting (E_ALL);

Zet dit bovenaan je PHP bestand.
Dit weergeeft alle PHP fouten, waarmee je makkelijker de fouten kunt vinden. Let op: gebruik dit niet als de website echt live (voor iedereen) gaat!

[ Voor 6% gewijzigd door andydewit op 09-04-2014 09:03 ]


Acties:
  • 0 Henk 'm!

  • jessy100
  • Registratie: November 2010
  • Laatst online: 09:07
InZane schreef op maandag 07 april 2014 @ 17:50:
[...]


Ik zou inderdaad maar even wat escapen of overstappen naar PDO.

Verder is mysql_query() toch deprecated?
Mysql is deprecated in php 5.5.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
jessy100 schreef op donderdag 10 april 2014 @ 22:51:
[...]


Mysql is deprecated in php 5.5.
Iets precieser (want 't klinkt nu net of PHP opeens geen MySQL meer ondersteunt): mysql_* functies worden niet meer ondersteund. MySQLi en PDO_MySQL worden wél nog ondersteund en daarmee MySQL als database dus ook.

[ Voor 6% gewijzigd door RobIII op 10-04-2014 23:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • blackspeedy
  • Registratie: Juni 2011
  • Laatst online: 22:46
NMe schreef op dinsdag 08 april 2014 @ 23:07:
[...]
afhankelijk van of je leraar al dan niet weet waar 'ie het over heeft. ;)
Dat is gelukkig het probleem niet, later in de opleiding gaan we er dieper op in kreeg ik te horen van hem.
De opleiding die ik nu volg is helemaal opnieuw opgezet dat is wel prettig dus veel nieuwe les stof :)
InZane schreef op woensdag 09 april 2014 @ 08:55:
[...]

Met 'anders' bedoel je 'mooier', toch? ;)
Ik hoor nu mijn C# Leeraar praten, haha.
Ik denk dat ik misschien toch voor web development ga, maar dat komt ook omdat ik daar nu nog meer kennis van heb.

klein stukje offtopic :X
Verder zoek ik eigenlijk een bij-baan als web-developer, maar ik zou dan bv. op zaterdag kunnen en misschien paar uurtjes op middagjes als ik geen school heb. Volgens mij zijn er zelden bedrijven die zo iets als mij aannemen denk ik?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
blackspeedy schreef op vrijdag 11 april 2014 @ 18:52:
Volgens mij zijn er zelden bedrijven die zo iets als mij aannemen denk ik?
Vast wel, maar dit wil ik graag even in de kiem smoren; het is namelijk niet de bedoeling hier (slinks :P ) open sollicitaties te gaan lopen doen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1