Toon posts:

PHP - PHP query result naar variabele

Pagina: 1
Acties:

Vraag


  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
Beste Tweakers

Ik slaag er maar niet in om een PHP variabele te vullen met het resultaat van een MySQLi query. Ik heb al een oplossing proberen vinden via Google, maar helaas zonder resultaat.

Ik geef een EAN-code in in een HTML form. Wanneer ik op submit klik, wil ik volgende code uitvoeren (maar dan werkend, natuurlijk);

PHP:
1
2
3
4
5
if(isset($_POST['submit'])){
$barcode = $_POST['submit'];
}

$voornaam = mysqli_query('SELECT voornaamLid FROM database WHERE barcode = ´$barcode´')


Hoe los ik dit op? bedankt!

Badge-IT Development Team

Alle reacties


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:01

Creepy

Tactical Espionage Splatterer

Misschien goed om de documentatie van mysqli_query er even bij te pakken. Dan heb je gelijk ook voorbeeld code over hoe je dit werkend krijgt. Hoe dit werkt staat daar namelijk letterlijk beschreven: https://www.php.net/manual/en/mysqli.query.php

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have star problems" --Kevlin Henney


  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Allereerst: gebruik in hemelsnaam Parametrized Queries. Je hebt nu een joekel van een SQL Injection vulnerability.

Verder: heb je de mysqli_query documentatie er gewoon al eens bij gepakt? Daarin lees je:
For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object.
...en als je die link volgt vind je vanzelf uit hoe je dat result kunt gebruiken / benaderen (zie bijv. de fetch_XXX methods).

De vragen die er staan wanneer je hier een nieuw topic opent staan er niet voor niks:
Mijn vraag
...

Relevante software en hardware die ik gebruik
...

Wat ik al gevonden of geprobeerd heb
...
Lees voor een volgend topic even onze Quickstart even door a.u.b. Ik mis o.a. de foutmelding(en) die je krijgt, wat je zélf al gezocht, gevonden en geprobeerd hebt en of je al hebt gedebugged (Debuggen: Hoe doe ik dat?).

Verder hoef je niet te ondertekenen / groeten ;)

[Voor 41% gewijzigd door RobIII op 04-02-2021 13:55]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Hydra
  • Registratie: September 2000
  • Laatst online: 24-03 08:31
RobIII schreef op donderdag 4 februari 2021 @ 13:46:
Allereerst: gebruik in hemelsnaam Parametrized Queries. Je hebt nu een joekel van een SQL Injection vulnerability.
Blijft schokkend om te zien dat anno 2020 er nog zo veel slechte PHP voorbeeldcode is.

https://niels.nu


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
BadgeIT Dev schreef op donderdag 4 februari 2021 @ 13:42:
PHP:
1
$voornaam = mysqli_query('SELECT voornaamLid FROM database WHERE barcode = ´$barcode´')
Met enkele quotes om je statement kan je volgens mij geen variabelen inline gebruiken. En je single quotes rond $barcode zijn scheef (` in plaats van '). Verder is het resultaat van mysqli_query geen string maar een database object. Probeer dit eens:
PHP:
1
2
3
4
5
$db_results = mysqli_query("SELECT voornaamLid FROM database WHERE barcode = '$barcode'");
while($db_result=mysqli_fetch_assoc($db_results))
{
    $voornaam = $db_result['voornaamLid'];
}

En vergeet vervolgens niet moderne standaarden te gebruiken zoals prepared statements, e.d.


Update: mysqli_query heeft een tweede argument, namelijk de database connectie. Deze moet dus toegevoegd worden in bovenstaande code.

[Voor 9% gewijzigd door KabouterSuper op 04-02-2021 19:58]


  • Chorro
  • Registratie: Oktober 2009
  • Laatst online: 23-03 14:48
Hydra schreef op donderdag 4 februari 2021 @ 14:32:
[...]


Blijft schokkend om te zien dat anno 2020 er nog zo veel slechte PHP voorbeeldcode is.
100% waar, het is bij zoveel sites (en dan al helemaal de 'hobby'-sites) zo gemakkelijk om binnen te komen middels SQL injection.

Ontopic: Ik zou je willen aanraden deze documentatie te lezen en dan het example dat daar staat te vullen met de parameters uit jouw situatie. Grote kans dat het dan goed gaat en maak je SQL injectie in ieder geval een heleboel stappen lastiger, zo niet onmogelijk.

  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
KabouterSuper schreef op donderdag 4 februari 2021 @ 14:38:
[...]
... Probeer dit eens:
PHP:
1
2
3
4
5
$db_results = mysqli_query("SELECT voornaamLid FROM database WHERE barcode = '$barcode'");
while($db_result=mysqli_fetch_assoc($db_results))
{
    $voornaam = $db_result['voornaamLid'];
}

...
Als ik deze code probeer, krijg ik volgende errors:
code:
1
2
3
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 52

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 53

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

BadgeIT Dev schreef op donderdag 4 februari 2021 @ 14:49:
[...]


Als ik deze code probeer, krijg ik volgende errors:
code:
1
2
3
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 52

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 53
Sorry, maar we zitten hier niet om handjes vast te houden. We willen je best in de juiste richting wijzen, maar je zult zelf ook wat moeten doen. Het minste wat je kan doen is de foutmelding lezen (en googlen) en de documentatie erbij nemen. In dit geval is de foutmelding vrij duidelijk.

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
RobIII schreef op donderdag 4 februari 2021 @ 14:55:
[...]

Sorry, maar we zitten hier niet om handjes vast te houden. We willen je best in de juiste richting wijzen, maar je zult zelf ook wat moeten doen. Het minste wat je kan doen is de foutmelding lezen (en googlen) en de documentatie erbij nemen. In dit geval is de foutmelding vrij duidelijk.
Ik heb slechts een basiskennis php en ervaring nihil. Ik begrijp dus veel dingen niet, maar probeer het wel te begrijpen en te leren. Mijn excuses iig.

  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

BadgeIT Dev schreef op donderdag 4 februari 2021 @ 14:58:
[...]


Ik heb slechts een basiskennis php en everaring nihil.
Dés te meer reden om 't niet met trial-and-error te leren maar gewoon een goed boek/tutorial erbij te nemen (of je lessen te volgen of...). Op deze manier ben je in ieder geval niet heel productief bezig en blijf je van de ene in de andere fout lopen. Excuses zijn niet nodig, we zijn allemaal niet geboren met die kennis en verwachten dat ook van jou niet ;) We verwachten wél dat je meer zélf doet :)

[Voor 14% gewijzigd door RobIII op 04-02-2021 15:00]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
BadgeIT Dev schreef op donderdag 4 februari 2021 @ 14:49:
[...]


Als ik deze code probeer, krijg ik volgende errors:
code:
1
2
3
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 52

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in C:\Users\stagiair\Downloads\Laragon\www\JCproject\index.php on line 53
php heeft helemaal gelijk, want de code die ik gaf was niet helemaal juist (ik werk al een jaar of 20 met databases, maar zelden zonder framework, dus kale database calls kom ik niet vaak tegen).

Zoals @RobIII zegt, is het wel vrij duidelijk wat er fout is (hint: mysqli_query heeft twee input parameters, terwijl ik in mijn code er maar eentje geef). Zodra je opgezocht hebt wat die tweede parameter is, weet je ook hoe je de fout moet oplossen. De tweede fout is het gevolg van de eerste fout.

  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
@KabouterSuper @RobIII Bedankt! Ik ga ermee aan de slag.

  • Chorro
  • Registratie: Oktober 2009
  • Laatst online: 23-03 14:48
Let wel; Goed te gebruiken om de materie te leren en voor eigen gebruik op een lokale omgeving ook prima. Maar zet dit alsjeblieft niet online, want je bent potentieel de volgende die gehackt gaat worden.
In dat geval, geen idee of je privacy gevoelige informatie ergens op die databaseinstallatie hebt staan en of je server verder wel goed beveiligd is. Maar het is kinderlijk eenvoudig deze data te kapen met zulke opbouw van queries.

  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
Chorro schreef op donderdag 4 februari 2021 @ 15:10:
[...]


Let wel; Goed te gebruiken om de materie te leren en voor eigen gebruik op een lokale omgeving ook prima. Maar zet dit alsjeblieft niet online, want je bent potentieel de volgende die gehackt gaat worden.
In dat geval, geen idee of je privacy gevoelige informatie ergens op die databaseinstallatie hebt staan en of je server verder wel goed beveiligd is. Maar het is kinderlijk eenvoudig deze data te kapen met zulke opbouw van queries.
Bedankt! Ik hou het momenteel nog offline, totdat de code veilig genoeg is.

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Chorro schreef op donderdag 4 februari 2021 @ 15:10:
[...]


Let wel; Goed te gebruiken om de materie te leren en voor eigen gebruik op een lokale omgeving ook prima. Maar zet dit alsjeblieft niet online, want je bent potentieel de volgende die gehackt gaat worden.
In dat geval, geen idee of je privacy gevoelige informatie ergens op die databaseinstallatie hebt staan en of je server verder wel goed beveiligd is. Maar het is kinderlijk eenvoudig deze data te kapen met zulke opbouw van queries.
Ach, dat gebeurt alleen in fillums.
Was getekend,
Robert'; DROP TABLE database;--

  • Chorro
  • Registratie: Oktober 2009
  • Laatst online: 23-03 14:48
BadgeIT Dev schreef op donderdag 4 februari 2021 @ 15:13:
[...]


Bedankt! Ik hou het momenteel nog offline, totdat de code veilig genoeg is.
d:)b
De code veilig genoeg krijgen, ga je zoals ik en anderen al hebben aangekaart op de simpelste manier eigenlijk enkel voor elkaar krijgen met die prepared statements. Dus de 'wat' is al duidelijk, de 'hoe' mag je zelf uitvinden ;)

  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
Update: ik heb me ingelezen in Prepared Statements. Daarna nieuwe code geschreven, en, hoera, het werkt! Bedankt voor alle input.

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 08:40

AW_Bos

Liefhebber van nostalgie... 🕰️

Het is overigens niet zo dat parameterized queries veiliger zijn, maar het neemt wel een hoop zorgen weg, zolang je maar weet wat je doet. Mogen we je code misschien zien, als je wilt? Want ik heb ook wel eens gezien dat iemand met zulke queries toch nog ergens de fout in schiet.

Je kan ook kiezen om bij elke input in een query (zoals je $_POST-variabele) gebruik je maken van mysqli_real_escape_string() om gevaarlijke karakters te escapen. Maar ook hierbij geldt: Weet wat je doet.
Mis je een paar quotes, dan blijft er nog een joekel van een kier open staan waarmee iemand je queries kan aanpassen.

[Voor 9% gewijzigd door AW_Bos op 04-02-2021 22:28]

☀️ Goedemorgen zonneschijn! ☀️
☀️Ja, je maakt me zo gelukkig, en door jou voel ik me fijn! ☀️


  • Merethil
  • Registratie: December 2008
  • Laatst online: 11:50
AW_Bos schreef op donderdag 4 februari 2021 @ 22:27:
Het is overigens niet zo dat parameterized queries veiliger zijn
Uhhh waarom niet? Prepared statements / parameterized queries zijn juist dé manier om SQL-injection te voorkomen.

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 08:40

AW_Bos

Liefhebber van nostalgie... 🕰️

Merethil schreef op donderdag 4 februari 2021 @ 23:16:
[...]

Uhhh waarom niet? Prepared statements / parameterized queries zijn juist dé manier om SQL-injection te voorkomen.
Het gaat er ook om hoe je het implementeert. ;)
Als je dit niet op de juiste manier doet, dan helpt het nog geen zier.

☀️ Goedemorgen zonneschijn! ☀️
☀️Ja, je maakt me zo gelukkig, en door jou voel ik me fijn! ☀️


  • Merethil
  • Registratie: December 2008
  • Laatst online: 11:50
AW_Bos schreef op vrijdag 5 februari 2021 @ 00:37:
[...]

Het gaat er ook om hoe je het implementeert. ;)
Als je dit niet op de juiste manier doet, dan helpt het nog geen zier.
Dat is met alles zo. Gewoon een fatsoenlijke library die ingebouwd zit in de taal en prepared statements uitvoert en je zit gebakken. Het is niet alsof je daar echt veel aan fout kan doen, tenzij je expres geen prepared statements gebruikt.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
AW_Bos schreef op donderdag 4 februari 2021 @ 22:27:

Je kan ook kiezen om bij elke input
Heel lang geleden leek dat een keuze, maar opt-in security, waar je enkel veilig bent als je bij élk gebruik aan alle details denkt, is echt een verloren zaak.

mysqli_real_escape_string() moet als dood beschouwd worden, en elke tutorial die het propageert ook.

{signature}


  • RobIII
  • Registratie: December 2001
  • Nu online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Hydra schreef op donderdag 4 februari 2021 @ 14:32:
[...]


Blijft schokkend om te zien dat anno 2020 er nog zo veel slechte PHP voorbeeldcode is.
offtopic:
Ik vind 't nog veel erger dat veel van die bagger gewoon onderaan in de comments in de documentatie op php.net zélf staat... :/

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Hydra
  • Registratie: September 2000
  • Laatst online: 24-03 08:31
AW_Bos schreef op donderdag 4 februari 2021 @ 22:27:
Het is overigens niet zo dat parameterized queries veiliger zijn
Natuurlijk zijn ze gewoon veiliger. Het onderliggende framework escaped je parameters voor je en er is gewoon geen enkele manier meer om daar uit te breken. Dus je kunt een hele klasse aan fouten gewoon niet meer maken.

Als dat niet de definitie van 'veiliger' is, weet ik het ook niet meer.

Al dat materiaal dat nog SQL aan elkaar concatenate zou gewoon ritueel verbrand moeten worden.

https://niels.nu


  • Hydra
  • Registratie: September 2000
  • Laatst online: 24-03 08:31
RobIII schreef op vrijdag 5 februari 2021 @ 09:36:
offtopic:
Ik vind 't nog veel erger dat veel van die bagger gewoon onderaan in de comments in de documentatie op php.net zélf staat... :/
offtopic:
Jemig. En PHP devs vragen zich af waarom er nog steeds lacherig gedaan wordt over PHP...

https://niels.nu


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 24-03 20:01

DexterDee

I doubt, therefore I might be

Komt er dus op neer, en dat is een goede les voor de TS, dat het altijd veiliger is om je logica en je data te scheiden. Niet alleen bij prepared statements in een database, maar ook bijvoorbeeld bij het uitvoeren van een lokaal commando of (god forbid) het eval'en van dynamische code.

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • BadgeIT Dev
  • Registratie: Februari 2021
  • Laatst online: 08-02-2021
AW_Bos schreef op donderdag 4 februari 2021 @ 22:27:
Het is overigens niet zo dat parameterized queries veiliger zijn, maar het neemt wel een hoop zorgen weg, zolang je maar weet wat je doet. Mogen we je code misschien zien, als je wilt? Want ik heb ook wel eens gezien dat iemand met zulke queries toch nog ergens de fout in schiet.

Je kan ook kiezen om bij elke input in een query (zoals je $_POST-variabele) gebruik je maken van mysqli_real_escape_string() om gevaarlijke karakters te escapen. Maar ook hierbij geldt: Weet wat je doet.
Mis je een paar quotes, dan blijft er nog een joekel van een kier open staan waarmee iemand je queries kan aanpassen.
Dit is mijn code:

PHP:
1
2
3
4
5
6
7
$sql = "SELECT example FROM example WHERE barcode=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $barcode);
$stmt->execute();
$result = $stmt->get_result();
$row = mysqli_fetch_array($result);
$example = $row['example'];
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee