(multiple) output dropdown correct weergeven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

.NET Developer

Dit ga je doen Tot jouw takenpakket behoort onder andere: Webapplicaties ontwerpen, bouwen, testen en implementeren in .NET/C#.; Ontwikkelen, implementeren en beheren van maatwerkapplicaties; Onderhouden en beheren van standaardpakketten; Onderzoeken en beoordelen van nieuwe technieken. Hier ga je werken Als .NET ontwikkelaar kom je te werken bij een grote semioverheidsinstelling in Nijmegen. De organisatie staat garant voor het leveren van onderwijs en les- en onderzoeksmateriaal voor duizenden betrokkenen. De organisatie wil bijdragen aan een gezonde, vrije wereld met gelijke kansen voor iedereen. Binnen de teams hangt een open en collegiale cultuur met veel aandacht voor een prettige en sociale werksfeer.

Bekijk vacature »

Ervaren Full-Stack PHP Developer

Functieomschrijving Gezocht! Ervaren PHP Developer! Voor een organisatie in de regio Harderwijk zoeken wij een ervaren PHP Developer die het IT team van dit bedrijf gaat versterken. We zijn op zoek naar een enthousiaste en breed georiënteerde IT-er die het innovatieve bedrijf nog een stap verder kan brengen. Voor deze functie zoeken wij iemand die communicatief goed is en die zelfstandig problemen op kan lossen. Je werkt samen met een externe ontwikkelpartij en kunt hun dus uitdagen op het geleverde werk. Het schrijven van concepten aan de AI en hardware kant valt onder je verantwoordelijkheden. Het bedrijf noemt zichzelf een

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Software Ontwikkelaar C# .NET

Functie omschrijving C# .NET Developer gezocht. Ben jij een full stack developer die op zoek is naar een nieuwe uitdaging binnen een leuk snel groeiend bedrijf? Lees dan snel verder! Wij zijn op zoek naar een Developer met ervaring op het gebied van .NET die een organisatie in de regio Amersfoort gaat versterken. Jij gaat je binnen dit bedrijf vooral bezighouden met het verbeteren van de functionaliteiten van hun dataplatform. Samen met andere ontwikkelaars denk je mee in oplossingsrichtingen, architectuur en nieuwe technologieën. Bedrijfsprofiel De organisatie waar je voor gaat werken heeft een onafhankelijk dataplatform ontwikkelt voor de agrarische sector.

Bekijk vacature »

Software developer (Python)

Functie Je komt te werken in het IT-team bestaande uit de Lead developer en 4 (medior/senior) developers. Gezamenlijk werken jullie aan de verbetering en uitbreiding van de software. Binnen het development team is er veel vrijheid en zelfstandigheid, zonder dat ze hiermee afdoen aan de kwaliteit. Zo hebben ze elke ochtend een korte stand-up (10:00 uur) en houden ze zo nu en dan pair-programming sessies. Ook is er een hele professionele ontwikkelcyclus waarbij code altijd eerst door een collega wordt getest voordat het naar deployement gaat. Je hebt in je werk oog voor kwaliteit, risico’s en het klantbelang. Communicatie met

Bekijk vacature »

.NET developer

Functie Jouw team van vier collega .NET developers is verantwoordelijk voor het bouwen van de ETL processen van jouw nieuwe werkgever. Op dit moment wordt de front-end gedaan door een extern team van professionals. Echter wilt jouw nieuwe werkgever graag intern deze kennis uitbreiden en heeft dan ook de ambitie om dit voor het eind van het jaar intern te gaan aanpakken. Dit betekend dat jij als .NET ontwikkelaar de ideale kans krijgt om jezelf samen met jouw collega’s te ontwikkelen als full stack developer. Als .NET ontwikkelaar werk jij bij deze gave werkgever met C# .NET, SQL, JavaScript, REST

Bekijk vacature »

.NET Developer Senior

Dit ga je doen Het ontwikkelen van backend applicaties in C#; Het maken van vele koppelingen met andere ERP-applicaties zoals JD Edwards en SAP; Je bent (mede) verantwoordelijk voor het opstellen van technisch ontwerpen voor de te ontwikkelen software oplossingen; Je bent gemiddeld 90% van je tijd inhouse oplossingen aan het ontwikkelen en testen. De overige 10% van je tijd ben je bij klanten op locatie om oplossingen te implementeren, klanten te begeleiden en de software verder te innoveren; Naast het zelfstandig ontwikkelen van software oplossingen ben je ook bezig met het waarborgen van je contacten bij de klant, het

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

Senior .NET developer

Klaar voor een nieuwe uitdaging? Welke technologieën gaan schuil achter de dagelijkse energievoorziening? Als senior .NET developer bij Kenter maak jij samen met je team het verschil, zowel voor de interne organisatie als voor eindklanten. Samen bouwen jullie aan innovatieve dienstverlening met behulp van de nieuwste technologieën en tools. Het is een functie met veel vrijheid, goede arbeidsvoorwaarden én je draagt jouw steentje bij aan de energietransitie. Klinkt dit als iets voor jou? Lees dan verder of solliciteer direct! Wat ga je doen als senior .NET developer? Als senior .NET developer bij Kenter (onderdeel van Alliander) ben je van onschatbare

Bekijk vacature »

.NET developer

Functie As a .NET developer you work together in a multidisciplinary development team with 1-2 Senior .NET developers, two front-end developers, Data Scientists and one UX designer. As a team you work on developing a Cloud based application and making this application more stable. Unit testing will also become very important in your new position. Together with the Senior .NET developer you will be responsible for developing the API. You work with a lot of data and occasionally there will also be data issues and some queries will have to be run. This means that you will work a lot

Bekijk vacature »

C#.NET developer

Functie Het development team bestaat momenteel uit vijf backend C#/.NET ontwikkelaars. Op dit moment zit één ontwikkelaar dedicated op de mobiele applicatie. Als team werk je samen aan het zelf ontwikkelde software platform. Dit bestaat uit zowel apps als websites. Om het systeem door meer dan honderdduizenden gebruikers wordt gebruikt is het bijna vanzelfsprekend dat de kwaliteit van het product hoog moet liggen. Het systeem bestaat uit drie projecten. Je werkt dus aan deze drie projecten waarbij de focus op z’n tijd verschuift. De technieken die worden toegepast zijn o.a. .NET Core, Xamarin, C# en MVC. Je zal dus met

Bekijk vacature »

Java Developer

Dit ga je doen Ontwerpen en bouwen van nieuwe functionaliteiten binnen de complexe omgeving; Proactief de processen kwalitatief en efficient inrichten; Opzetten van Unit Tests; Code Reviews; Regie nemen voor innovatieve projecten; Landschap beheren en de bijbehorende ketens hierbij in het oog houden. Hier ga je werken De organisatie is actief binnen de financiele branche en heeft een IT afdeling van circa 450 man. De organisatie voorziet de maatschappij binnen de financiele dienstverlening en is gedurende de jaren een onmisbare schakel geworden. Het is een high profile organisatie waar ze veel te maken hebben met veranderingen voortkomend uit maatschappelijke ontwikkelingen,

Bekijk vacature »

JAVA Programmeur

Bedrijfsomschrijving Functieomschrijving We zoeken per direct enthousiaste software engineers die ons team komen versterken.We werken in DevOps teams met een sterk gevoel voor verantwoordelijkheid. Er wordt nauw samengewerkt met ons Business analyse team (BAT), met onze uitvoerende medewerkers en met de DevOps teams onderling binnen het domein. Het liefst hebben we veel en vaak interactie met onze interne en externe eindgebruikers om zo de juiste dingen te maken. We werken multidisciplinair in een dynamische omgeving. Achtergrond opdracht De Businesseenheid Examens is verantwoordelijk voor de logistiek van de staatsexamens Voortgezet (speciaal) onderwijs, Nederlands als 2e taal en schoolexamens. In het kader

Bekijk vacature »

C# .NET Developer

Functie omschrijving Wij zijn op zoek naar een C# .NET Developer voor een bedrijf in de omgeving van Utrecht! Wil jij werken voor een internationaal bedrijf waar je legio mogelijkheden krijgt als Software Ontwikkelaar? Grijp nu je kans! Je kunt een uitdagende rol gaan vervullen als C#.NET Developer binnen een internationaal bedrijf dat gevestigd is in omgeving van Utrecht. Je zult gaan samenwerken met collega's die over de hele wereld verspreid zitten. Dit bedrijf is zeer vooruitstrevend en werkt met de nieuwste technieken. Als C#.NET Developer ga jij je bezig houden met het volgende: Je blijft op de hoogte van

Bekijk vacature »
Johan Steel

Johan Steel

12/10/2020 12:14:19
Quote Anchor link
Beste forum leden,

Als beginner is het mij gelukt om dropdown menu te maken vanuit een SQL db. Nu zou ik graag zien dat ook meerdere selecties in dit menu te maken zijn. Ook dit is deels gelukt, alleen bij de output wordt slechts 1 gekozen optie weergegeven. Wie kan mij een beetje op weg helpen? Veel dank.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
    include'dbh.php';
?>


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
    <title>TST</title>
    <link rel="stylesheet" type="text/css" href="style.css">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://fonts.googleapis.com/css2?family=Dosis:wght@500&family=Karla:ital@1&family=Nanum+Gothic:wght@700&family=Raleway:wght@300;400&display=swap" rel="stylesheet">
  <style>

  body{
    text-align:center;
    background-color: #EEEEEE;
    }

  .container{
    width:1040px;
    margin: 0px auto;
    overflow: hidden;
    background: white;
   }

  .container header{
    width: 1040px;
    text-align: center;
    margin-top: 10px;
    border-bottom: 1.4px solid  #a9a9a9;
    font-family: 'Karla', sans-serif;
    font-size: 30px;
    color: #242424;
    float: left;
}
  div.item{
    width: 300px;
    height: 220px;
    margin-top: 15px;
    margin-left: 3.5%;
    font-family:  sans-serif;
    display: inline-block;
    font-size: 13px;
    float: left;
      }

  img{
      border-radius: 3%;
      }

    a{
      text-decoration:none;
      color: inherit;
      }


</style>
</head>

<?php
$resultcountry
=$conn->query("SELECT DISTINCT country_caught FROM dataset ORDER BY country_caught ASC");
?>


<h1>SEARCH</h1>

<hr/>
<body>
    <form id= method="GET" action="" >
      <select name="country_caught" multiple >
        <?php
        while($rows=$resultcountry->fetch_assoc())
        {

            $country=$rows['country_caught'];
            echo "<option style='display:none'>Country</option>
                  <option value='$country'>$country</option>"
;
        }

        ?>

      </select>
         <button type="submit" name="submit-misc-search" >GO!</button>
    </form>

<hr/>
  <?php

      if(isset($_GET['submit-misc-search'])){
        $country=$_GET['country_caught'];
        $sql1 = "SELECT * FROM dataset WHERE country_caught LIKE '$country' ";
        $result1 =  mysqli_query($conn, $sql1);
        $queryResult1 = mysqli_num_rows($result1);
  ?>


   <body>
  <section class="container">

     <?php
           if($queryResult1 > 0)
           echo
           "<header>
           <p>$country ($queryResult1)</p>
           </header>"
;

         {

            while($row = mysqli_fetch_assoc($result1)){
                  echo " <div class='item'>
                         <a href='medium/"
.$row['photo_id'].".jpg'><img src='small/".$row['photo_id'].".jpg'</a><br>
                         </div>"
;

                                     }
                         }
}

                     ?>


 </section>
</html>
 
 
PHP hulp

PHP hulp

29/03/2024 03:14:09
 
- Ariën  -
Beheerder

- Ariën -

12/10/2020 12:40:56
Quote Anchor link
Ik zie dat je hem inderdaad al 'multiple' gemaakt hebt.
Echter meot je wel eerst aangeven dat de output een array moet worden. Dat kan door twee open-en-sluitende blokhaken achter je de waarde van eht name-attrubute te zetten: name="country_caught[]"

Vervolgens kan je alle gekozen waardes met bijv. foreach() uitlezen uit $_POST['country_caught'] die in feite dus een array is.

Verder wil ik je wel even wijzen dat lijn 88 een SQL-injection heeft. Jijzelf en jan-en-alleman kunnen je query dus manipuleren met onbedoelde en zelfde kwade gevolgen. Dus escape $country even met mysqli_real_escape_string().

Als ik verder nog een tip mag geven: Stap af van genummerde queries. Nu weet je nog wat iets doet, maar als je script groter is, dan moet je dat steeds opzoeken. Iets met $result_country zegt precies wat de result is.
Gewijzigd op 12/10/2020 12:41:18 door - Ariën -
 
Ad Fundum

Ad Fundum

12/10/2020 12:54:52
Quote Anchor link
- Ariën - op 12/10/2020 12:40:56:
Dus escape $country even met mysqli_real_escape_string().


Alleen prepared statements beschermen volledig tegen SQL-injectie.
https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
 
- Ariën  -
Beheerder

- Ariën -

12/10/2020 13:04:15
Quote Anchor link
Leg uit?

mysqli_real_escape_string() werkt even goed.
Vroeger was het wat buggy, maar tegenwoordig werkt het prima, zolang je het goed aanpakt. Prepared statements zijn ook een keuze.
Gewijzigd op 12/10/2020 13:06:07 door - Ariën -
 
Johan Steel

Johan Steel

12/10/2020 14:01:52
Quote Anchor link
Hi Ariën,

Dank voor je snelle reply! Die tip mbt de name-attribute had ik indd ook gevonden (en geprobeerd), helaas werkte dat voor mij niet. Maar dat komt waarschijnlijk omdat ik het fout doe :-). Het probleem zit hem vooral in de output, dus hoe krijg ik een 'multiple' output. Op dit moment kan ik dus meerdere "country" selecteren, echter hij spuugt dan enkel 1 selectie goed uit. Jouw tip mbt foreach() zou denk ik de oplossing zijn. Als beginner weet ik die echter niet goed te intregreren in onderstaande code, wellicht kan iemand mij helpen? :

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
<?php
           if($queryResult1 > 0)
           echo
           "<header>
           <p>$country ($queryResult1)</p>
           </header>"
;

         {

            while($row = mysqli_fetch_assoc($result1)){
                  echo " <div class='item'>
                         <a href='medium/"
.$row['photo_id'].".jpg'><img src='small/".$row['photo_id'].".jpg'</a><br>
                         </div>"
;

                                     }
                         }
}

                     ?>
 
- Ariën  -
Beheerder

- Ariën -

12/10/2020 14:26:10
Quote Anchor link
het is trouwens $_GET['country_caught']. Maar waarom zou je dit via GET willen doen, en niet via POST?
Een zoekfunctie via GET laten werken, kan ik goed begrijpen. Maar een formulier om data in te voeren/te bewerken kan prima via POST.

Verder klopt die SQL ook niet. Je hebt een hele bak met geselcteerde country's. Die kan je niet zomaar aan een LIKE query voeren. Die moet je dan stuk per stuk uitlezen en met implode() combineren tot een SELECT... IN () query.

Maar gezien je twee queries uitvoert, dan vraag ik me af of een JOIN niet slimmer is.
Gewijzigd op 12/10/2020 14:27:14 door - Ariën -
 
Johan Steel

Johan Steel

12/10/2020 15:16:50
Quote Anchor link
Hi Arië,

Dank voor je snelle reply. De reden voor het GET ipv POST; ik copy paste soms de link zodat iemand anders deze kan openen en dezelfde output ziet. Thanks ook voor je security (SQL injectie) opmerking, daar ga ik zeker wat mee doen.

De huidige code is echt ontstaan vanuit de gedachte dat er 1 "country" geselecteerd wordt. Dat werkte prima.. Maarja, nu kom ik tot het inzicht dat meerdere landen als output ook wel handig is.

Is de huidige code niet met een kleine, intelligente verandering aan te passen, zodat meerdere landen op dezelfde manier worden weergegeven? Of moet ik het echt grondig gaan her ontwerpen?
 
- Ariën  -
Beheerder

- Ariën -

12/10/2020 15:22:10
Quote Anchor link
Ik zou het toch even her-ontwerpen als ik jouw was.
Maak bij voorkeur een stroomdiagram die aangeeft wat er moet gebeuren, en hoe een request plaatsvindt.
Gewijzigd op 12/10/2020 15:23:09 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

12/10/2020 17:01:31
Quote Anchor link
Ad Fundum op 12/10/2020 12:54:52:
Alleen prepared statements beschermen volledig tegen SQL-injectie.

Alleen een juist gebruik van een bepaalde methodiek leidt tot veilige queries. Er zijn nog zat mensen die lappen SQL concateneren in de een query die (ook) gebruik maakt van prepared statements.

- Ariën - op 12/10/2020 13:04:15:
mysqli_real_escape_string() werkt even goed.

Ook deze stelling is niet helemaal juist. In een opzet waarbij je geen gebruik maakt van prepared statements is enkel de combinatie van het gebruik van quotes en real_escape_string() veilig, zoals hier (interne link) staat uitgelegd. real_escape_string() is ook alles behalve een wondermiddel. Het is en blijft belangrijk dat je snapt wat er gebeurt en wat ervoor zorgt dat queries veilig zijn en blijven.

Johan Steel op 12/10/2020 15:16:50:
Is de huidige code niet met een kleine, intelligente verandering aan te passen, zodat meerdere landen op dezelfde manier worden weergegeven? Of moet ik het echt grondig gaan her ontwerpen?

Misschien een lijst van checkboxen voor makkelijkere selectie? Als je verkeerd klikt in een multiselect ben je je selectie kwijt. Of je maakt hier een apart formulier-element voor:
Afbeelding

Wat voor oplossing je ook kiest, je hebt dan waarschijnlijk nog steeds een array van waarden. Die zul je op een zodanige manier moeten verwerken in je query zodat al deze landen worden opgepikt. Ik denk dat op dit moment je query misgaat. Voor debugging is het handig om de query eerst op te bouwen in een string, dan kun je deze in afzondering bestuderen. Tegelijkertijd zou je ook na kunnen denken over hoe e.e.a. makkelijker gemaakt kan worden qua interactie/navigatie.
Gewijzigd op 12/10/2020 17:16:51 door Thomas van den Heuvel
 
Johan Steel

Johan Steel

12/10/2020 17:06:45
Quote Anchor link
Thanks voor de hulp! Het is voor mij als beginneling misschien net iets te lastig om dit voor elkaar te krijgen, maar ik ga een poging wagen. Was eigenlijk wel blij dat het net werkte :-) Maarja, als je dan weer al die mooie mogelijkheden ziet, wil je toch weer meer.
 
Ad Fundum

Ad Fundum

13/10/2020 17:28:04
Quote Anchor link
- Ariën - op 12/10/2020 13:04:15:
Leg uit?
mysqli_real_escape_string() werkt even goed.


mysqli_real_escape_string() is problematisch.

1. Het is niet veilig als je geen quotes gebruikt. Niet handig voor numerieke kolommen, of wanneer de kolom van datatype verandert, dan zou het voor kunnen komen dat je alle queries langsmoet in je PHP-code, als je alle quotejes al paranoïde bij hebt bijgehouden.
Dat alleen al is een beveiligingsrisico.

2. Het kan verkeerd gaan als je de encoding niet goed hebt ingeregeld voordat je mysqli_real_escape_string() aanroept.
Goed: mysqli_set_charset('utf8', $link);
Fout: mysqli_query("SET NAMES 'utf8'", $link);
Het gaat fout omdat de MySQL API niet wordt ingesteld met de juiste encoding.

3. mysqli_real_escape_string() werkt niet in combinatie met de LIKE-operator. Kan je daarvoor weer het wiel uitvinden.

Prepared statements hebben deze problemen niet, het gaat altijd goed omdat je de variabelen apart meegeeft als functieargumenten. Het beschermt daardoor tegen SQL-injectie.
mysqli_real_escape_string() gaat niet per definitie goed, het beschermt niet per se tegen SQL-injectie, de veiligheid moet dus geborgd door de programmeur.

Daarom: weg met mysqli_real_escape_string(), en altijd prepared statements gebruiken.
Gewijzigd op 13/10/2020 17:34:54 door Ad Fundum
 
- Ariën  -
Beheerder

- Ariën -

13/10/2020 18:07:32
Quote Anchor link
Iedereen zijn eigen mening. Maar wat is er mis met de LIKE-operator?

Dit werkt toch prima?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$sql
= "SELECT * FROM Customers
WHERE CustomerName LIKE '"
.mysqli_real_escape_string($conn, $input)."%'";
?>


Het staat tussen quotes, het heeft niks met LIKE te doen.
Leest alleen een beetje rot met die quotes.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2020 18:10:39
Quote Anchor link
Geen enkele methodiek is veilig als de persoon in kwestie niet weet waar 'ie mee bezig is. Misschien word je wat meer tegen jezelf beschermd met prepared statements, maar onwetendheid is nog steeds geen excuus.

#1 hoe belemmeren quotes het gebruik van numerieke kolommen? je bedoelt het afwezig zijn hiervan? gewoon overal consequent quotes gebruiken en escapen - geen probleem, ook al verandert het datatype. Daarbij, als je de structuur verandert loont het altijd de moeite om code die hierop van toepassing is even langs te lopen? dit zou ik niet blind doen

#2 mja set_charset() is belangrijk, omdat dat bepaalt hoe real_escape_string() werkt; zo zijn de regels van het spel

#3 sja en LIMIT werkt ook niet vlekkeloos in alle gevallen, er zullen altijd uitzonderingen zijn, vind ik niet echt een onoverkomelijk probleem... het is in ieder geval geen reden om een aanpak dan maar helemaal op voorhand af te schrijven

Quote:
Daarom: weg met mysqli_real_escape_string(), en altijd prepared statements gebruiken.

Het probleem ligt niet bij de methoden die veilig zijn, het probleem ligt bij het gebrek aan kennis over deze concepten. Zelfs als je prepared statements gebruikt zou je nog steeds moeten snappen hoe dit werkt en waarom dit veilig is anders gaat dit gewoon op een gegeven moment nog steeds mis, denk aan concatenatie van SQL/variabelen in een prepared statement.

Daarbij, prepared statements in mysqli zijn onwijs clunky, en in PDO wordt standaard een emulatielaag gebruikt, waarbij niet eens de native support voor prepared statements binnen MySQL wordt gebruikt.

Je zou natuurlijk ook niet enkel de nadruk kunnen leggen op de methodiek, maar ook kunnen kijken wat gewoon prettig werkt. Dit vergt dan misschien wat meer discipline, maar het is waarschijnlijk in het gebruik (stukken) makkelijker.

Kies de aanpak die jou het makkelijkste lijkt, begrijp waarom deze veilig is en kies deze ook vooral op grond van valide argumenten want er circuleert een hoop onzin op het internet over wat "veilig" of "beter" zou zijn.
Gewijzigd op 13/10/2020 18:17:27 door Thomas van den Heuvel
 
Ad Fundum

Ad Fundum

14/10/2020 12:40:35
Quote Anchor link
Thomas van den Heuvel op 13/10/2020 18:10:39:
Geen enkele methodiek is veilig als de persoon in kwestie niet weet waar 'ie mee bezig is. Misschien word je wat meer tegen jezelf beschermd met prepared statements, maar onwetendheid is nog steeds geen excuus.


Dat is dus het hele punt. Je wordt niet tegen jezelf beschermd. Prepared statements beschermen jou tegen SQL-injectie. mysqli_real_escape_string() doet dat niet, tenzij je zelf altijd enorm oplet.
Daarbij, 'even' langslopen van je code hangt af van hoe effectief je je tijd wilt besteden.
Naarmate het aantal SLOC stijgt, verspil je meer tijd met onnodig langslopen.

Het enige vervelende dat ik had in de tijd dat ik nog aan MySQL vastzat is dat er geen equivalent bestaat voor pg_query_params(). Misschien dat PDO daar iets voor heeft, dat weet ik niet. Maar gelukkig kan je ook zelf een mysqli_query_params() maken. Misschien wel leuk voor bij de PHP Scripts.
Gewijzigd op 14/10/2020 12:41:12 door Ad Fundum
 
- Ariën  -
Beheerder

- Ariën -

14/10/2020 12:55:19
Quote Anchor link
Ad Fundum op 14/10/2020 12:40:35:

Dat is dus het hele punt. Je wordt niet tegen jezelf beschermd. Prepared statements beschermen jou tegen SQL-injectie. mysqli_real_escape_string() doet dat niet, tenzij je zelf altijd enorm oplet.

Daarom is het inderdaad de afweging die de programmeur zelf wilt maken. Het is daarom niet dat de escape-functie meteen slecht is.

Als je het vanaf begin af aan consequent op de juiste manier blijft toepassen (quotes, encoding), dan is er niks aan de hand.
Gewijzigd op 14/10/2020 12:55:36 door - Ariën -
 
Ad Fundum

Ad Fundum

14/10/2020 13:16:59
Quote Anchor link
mysqli_real_escape_string() is neutraal, het doet precies wat het zegt dat het doet.
Wat er slecht aan is, is dat er vaak van gezegd wordt dat het beschermt tegen SQL-injectie.
En dat doet het niet, dat moet je zelf blijven doen.
Tenzij je gebruikt maakt van prepared statements.

Als (beginnend) programmeur kan je vrij snel op het verkeerde been gezet worden, en dat doet afbreuk de filosofie van PHP als zijnde een pragmatische taal. mysqli_real_escape_string() is niet praktisch, het is eerder onhandig. Om de reden die Thomas noemt: je moet al je code in de gaten blijven houden. Dat mensen dan nog er voor kiezen om mysqli_real_escape_string() te willen blijven gebruiken kan ik echt niet volgen.
Gewijzigd op 14/10/2020 13:18:33 door Ad Fundum
 
- Ariën  -
Beheerder

- Ariën -

14/10/2020 13:41:55
Quote Anchor link
Ad Fundum op 14/10/2020 13:16:59:
mysqli_real_escape_string() is neutraal, het doet precies wat het zegt dat het doet.
Wat er slecht aan is, is dat er vaak van gezegd wordt dat het beschermt tegen SQL-injectie.
En dat doet het niet, dat moet je zelf blijven doen.

Het helpt theoretisch dan voor 50% procent, kan je zeggen. Je moet zelf netjes de quotes in je query toevoegen waar het moet, maar dat is gewoon weer iets wat je zelf moet aanleren als je MySQL gebruikt. Mis je de quotes, dan denkt MySQL dat het om een veld gaat i.p.v. een string, en als het om een input gaat, dan denkt MySQL dat het onderdeel is van een query. Dus daarom alle input in je query netjes escapen.
Quote:
Als (beginnend) programmeur kan je vrij snel op het verkeerde been gezet worden, en dat doet afbreuk de filosofie van PHP als zijnde een pragmatische taal. mysqli_real_escape_string() is niet praktisch, het is eerder onhandig. Om de reden die Thomas noemt: je moet al je code in de gaten blijven houden. Dat mensen dan nog er voor kiezen om mysqli_real_escape_string() te willen blijven gebruiken kan ik echt niet volgen.

Als je meer van de prepared statements bent, dan gebruik je dat. Als je beiden (afzonderlijk van elkaar dan) op de juiste manier toepast, dan is de uitkomst uiteindelijk hetzelfde. Het is een keuze die de programmeur zelf moet maken.
Het is niet zo dat het ene inferieur is vergekelen met het andere.

Een slot in een deur moet je ook op de juiste manier inbouwen. Schroef je hem er niet in vast, dan tik je hem er ook zo uit.
Gewijzigd op 14/10/2020 13:49:06 door - Ariën -
 
Ad Fundum

Ad Fundum

14/10/2020 15:13:06
Quote Anchor link
- Ariën - op 14/10/2020 13:41:55:
Een slot in een deur moet je ook op de juiste manier inbouwen. Schroef je hem er niet in vast, dan tik je hem er ook zo uit.


Naar analogie met mysqli_real_escape_string():
Als er dan toch zomaar ineens wordt ingebroken, dan had je van te voren zelf maar zo gis moeten zijn om een slot met kerntrekbeveiliging te gebruiken.
(En een SECU-strip te plaatsen, en een deur met driepuntssluiting te hebben, en je licht aanmoeten houden, en niet op social media moeten zetten dat je een weekje op vakantie was...)

Maar je hebt gelijk: bij goed gebruik kan het goed werken. Als je tijd te veel hebt zou ik zeggen: ga vooral voor mysqli_real_escape_string(), ik hou je niet tegen! :)
Gewijzigd op 14/10/2020 15:14:50 door Ad Fundum
 
Thomas van den Heuvel

Thomas van den Heuvel

14/10/2020 19:54:42
Quote Anchor link
Ad Fundum op 14/10/2020 15:13:06:
Als je tijd te veel hebt zou ik zeggen: ga vooral voor mysqli_real_escape_string(), ik hou je niet tegen! :)


Afbeelding
 
Ad Fundum

Ad Fundum

14/10/2020 20:11:11
Quote Anchor link
Helemaal gelijk Thomas, daarom is er ook zoiets als pg_query_params(), en mysqli_bind_params() (net ff als scriptje toegevoegd).

'Doe het goed, doe het nu'.
Gewijzigd op 14/10/2020 20:22:52 door Ad Fundum
 



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.