Database connectie Mysql met MYSQLI

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Bamidrone
  • Registratie: December 2017
  • Laatst online: 01-02 11:35
Hallo Allen,

Even voorstellen:

Ik ben een 3e jaars MBO student die ICT beheer studeert, ik klooi in mijn vrije tijd met netwerk gerelateerde zaken, Linux en leren voor certificering. Nu wil ik ook beginnen met programmeren. Ik heb enkele jaren geleden geprobeerd te beginnen met Javascript via Codeacadamy maar haakte na enkele uren helaas af.

Ik ga aankomend jaar naar het HBO en in het eerste jaar komt programmeren aan bod met O.A. PHP. Om mij enigszins voor te bereiden wil ik nu al wat geoefend hebben met O.A. PHP.



TLDR

Het probleem:

Ik wil graag een database connectie maken met een mysql database die wat informatie bevat 3 tabellen met wat rows. Ik draai lokaal USB webserver voor het gemak. Ik kan echter wel een connectie maken maar wanneer ik de query wil uitvoeren en de data naar voren wil laten komen krijg ik een foutmelding :'(

Namelijk de volgende:

mysqli_use_result() expects parameter 1 to be mysqli


Dit is de code die ik gebruik:

code: 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
 for (i = 0; i < 4; i++) {<?php

De code:

$DB_SERVER = "localhost";
$DB_USER = "root";
$DB_PASS = "usbw";
$DB_NAME = "world";

// connectie maken

$db_connection = mysqli_connect ($DB_SERVER, $DB_USER, $DB_PASS, $DB_NAME);

if (mysqli_connect_error())

{

echo "Failed to connect to MySQL: " . mysqli_connect_error();
 //you need to exit the script, if there is an error

exit();
}

$query ="SELECT * FROM city";
$result =mysqli_query($db_connection, $query);
mysqli_use_result ($result);
?>

 }


Voordat ik deze post heb gemaakt ben ik zelf uiteraard ook op onderzoek uitgegaan. Ik heb de onderstaande dingen geprobeerd/nagelopen

Result als eerste de db_connectie uitvoeren en dan de query. I.P.V. andersom wat voor de zelfde melding kan zorgen

Link: https://stackoverflow.com...eter-1-to-be-mysqli-error

Gekeken als ik wel de juiste credentials gebruikte en de Mysql wel juist draaide.

Link: https://stackoverflow.com...o-be-mysqli-boolean-given

Een post op stackoverflow had het ook nog over dat het mixen van MYSQL en MYSQLI statements kon leiden tot de foutmelding, maar dat doe ik zoals jullie kunnen zien niet.

Ik hoop dat jullie mij hiermee kunnen helpen, een hint naar een antwoord kan ik waarderen!

Alvast bedankt en nog een prettige zondag gewenst!

Beste antwoord (via Bamidrone op 30-04-2018 18:24)


Verwijderd

De manual geeft duidelijk aan dat het om een mysqli link gaat, waar het antwoord van de laatste query betreft (net als mysql_insert_id).

PHP:
1
mysqli_use_result ($db_connection);


Verder is het aan te raden om PHP PDO te gebruiken voor databases i.p.v. mysql(i)_* functies. Dit zorgt met PDO::prepare (en PDO::execute, PDO::bindParam, PDO::bindValue) voor extra security en uniformiteit in database gebruik. Je kan de onderliggende database vervangen zonder verdere aanpassingen (van mysql naar psql, etc).


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$user='test';
$pass='test';
$database='test';
$host='localhost';

//$dbh = new PDO('pgsql:host='.$host.';port=5432;dbname='.$database, $user, $pass);
$dbh = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pass);

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();


Alle (school)boeken die nog mysql(i)_* aanraden zijn wat mij betreft outdated.
Ook is het gebruik van $_GET/$_POST ouderwets en onveilig, gebruik filter_input.

Alle reacties


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
Wat voor foutmelding krijg je?

Acties:
  • 0 Henk 'm!

  • Bamidrone
  • Registratie: December 2017
  • Laatst online: 01-02 11:35
418O2 schreef op zondag 29 april 2018 @ 16:28:
Wat voor foutmelding krijg je?
Excuses, die was ik vergeten te melden..... Dit is de foutmelding:

mysqli_use_result() expects parameter 1 to be mysqli

Acties:
  • 0 Henk 'm!

  • Heikanu
  • Registratie: Juni 2007
  • Laatst online: 29-09 21:40
Ik stel voor dat je eens in de PHP manuals kijkt bij mysqli_query en mysqli_use_result, en dan in het bijzonder naar de return values en de types van de parameters die meegegeven dienen te worden ;)

[ Voor 3% gewijzigd door Heikanu op 29-04-2018 16:42 ]


Acties:
  • 0 Henk 'm!

  • Bamidrone
  • Registratie: December 2017
  • Laatst online: 01-02 11:35
Heikanu schreef op zondag 29 april 2018 @ 16:41:
Ik stel voor dat je eens in de PHP manuals kijkt bij mysqli_query en mysqli_use_result, en dan in het bijzonder naar de return values en de types van de parameters die meegegeven dienen te worden ;)
Zal ik doen, hopelijk kom ik eruit, anders horen jullie het wel. In ieder geval eerst zelf even mee gaan spelen :)

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Nu online
Bamidrone schreef op zondag 29 april 2018 @ 17:10:
[...]


Zal ik doen, hopelijk kom ik eruit, anders horen jullie het wel. In ieder geval eerst zelf even mee gaan spelen :)
Lees tutorials, zoek op foutmeldingen als je die krijgt en lees de documentatie als je een nieuwe methode gebruikt (of oude, ik zoek nog regelmatig triviale zaken op die ik al 12 jaar gebruik)

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je $result is al een mysqli_result object ;)
Return Values

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

Maak je niet druk, dat doet de compressor maar


Acties:
  • Beste antwoord
  • +3 Henk 'm!

Verwijderd

De manual geeft duidelijk aan dat het om een mysqli link gaat, waar het antwoord van de laatste query betreft (net als mysql_insert_id).

PHP:
1
mysqli_use_result ($db_connection);


Verder is het aan te raden om PHP PDO te gebruiken voor databases i.p.v. mysql(i)_* functies. Dit zorgt met PDO::prepare (en PDO::execute, PDO::bindParam, PDO::bindValue) voor extra security en uniformiteit in database gebruik. Je kan de onderliggende database vervangen zonder verdere aanpassingen (van mysql naar psql, etc).


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$user='test';
$pass='test';
$database='test';
$host='localhost';

//$dbh = new PDO('pgsql:host='.$host.';port=5432;dbname='.$database, $user, $pass);
$dbh = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pass);

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();


Alle (school)boeken die nog mysql(i)_* aanraden zijn wat mij betreft outdated.
Ook is het gebruik van $_GET/$_POST ouderwets en onveilig, gebruik filter_input.

Acties:
  • +1 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10 11:33
Aanvulling op @Verwijderd.

Zie https://www.w3schools.com/php/php_mysql_intro.asp voor meer informatie :)

Ik doe zelf de opleiding Applicatie ontwikkeling en dat is vooral PHP/MySQL. Ik raad PDO aan en dan met de bind parameters. Dit is namelijk veiliger. zie ook: https://www.w3schools.com/sql/sql_injection.asp

mocht je nog vragen hebben mag je ook een PM sturen ;) ik kan je nog wel wat leuke tips geven.

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 02-10 08:45
Aanvulling @Verwijderd en @moese

Nee. PDO is NIET veiliger. PDO is makkelijker.
Het is idd best practice om geparameteriseerde queries te gebruiken. Maar of je dit met PDO, mysqli, of welke database wrapper dan ook doet, maakt niet uit. Er zijn zelfs edge-cases waarin het via PDO onveiliger is aangezien PDO in sommige gevallen queries compiled naar plain-text (en het effectief dus weer een concatenated string is).

TL;DR
Ja: gebruik geparameteriseerde queries. Dat is veiliger.
Ja: gebruik PDO. Het is makkelijker en compatibler.
Nee: denk niet dat PDO magisch veiliger is dan [random andere wrapper].

Acties:
  • +1 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 14:25

Creepy

Tactical Espionage Splatterer

Dat laatste geldt overigens ook voor filter_input. Dat is uitzichzelf niet veilig dan $_POST en $_GET gebruiken omdat de default bij filter_input is dat er niet wordt gefilterd ;)
moese schreef op maandag 30 april 2018 @ 09:54:
mocht je nog vragen hebben mag je ook een PM sturen ;) ik kan je nog wel wat leuke tips geven.
Tof van je dat je dat aanbiedt, maar hier in de Devschuur hebben we er dan weinig aan. Het zou leuk zijn dat vragen e.d. op een normale manier hier in het forum worden gesteld zodat meer mensen er wat aan hebben.

[ Voor 54% gewijzigd door Creepy op 30-04-2018 11:06 ]

"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


Acties:
  • 0 Henk 'm!

Verwijderd

Natuurlijk kan je het met nette functies ook verprutsen. Mijn ervaring leert dat programmeurs de features van dergelijke functies op de juiste manier gebruiken. Het is beter om uniforme wrappers (PDO en filter_*) te gebruiken, dan dat ieder z'n eigen sh*t zit te programmeren! ;)

Het is natuurlijk geen 100% garantie. Als ik een lege filter_input vind (zonder FILTER_*), heeft de programmeur wat uit te leggen. Dat is een security check die ik uitvoer, net als geautomatiseerd zoeken naar zooi als $_GET/$_POST/etc.

Acties:
  • 0 Henk 'm!

  • Bamidrone
  • Registratie: December 2017
  • Laatst online: 01-02 11:35
moese schreef op maandag 30 april 2018 @ 09:54:
Aanvulling op @Verwijderd.

Zie https://www.w3schools.com/php/php_mysql_intro.asp voor meer informatie :)

Ik doe zelf de opleiding Applicatie ontwikkeling en dat is vooral PHP/MySQL. Ik raad PDO aan en dan met de bind parameters. Dit is namelijk veiliger. zie ook: https://www.w3schools.com/sql/sql_injection.asp

mocht je nog vragen hebben mag je ook een PM sturen ;) ik kan je nog wel wat leuke tips geven.
Bedankt voor je reactie, ik zal als ik echt vastloop je een PM sturen als het aanbod dan nog staat uiteraard! :)

Acties:
  • 0 Henk 'm!

  • Bamidrone
  • Registratie: December 2017
  • Laatst online: 01-02 11:35
Iedereen voor de rest uiteraard ook bedankt voor de reactie en tips, ik ga PDO bekijken en uitproberen op jullie advies!

Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 02-10 11:33
Bamidrone schreef op maandag 30 april 2018 @ 18:23:
[...]


Bedankt voor je reactie, ik zal als ik echt vastloop je een PM sturen als het aanbod dan nog staat uiteraard! :)
uiteraard :) succes!
Pagina: 1