Controle op connectie met MySQLi
Ik heb de afgelopen tijd heel veel vragen gesteld maar ik kom tot de ontdekking het niet goed te begrijpen. Daarom back to basic. Als mensen mij willen helpen zou ik het leuk vinden anders houd het op.
Ik begin wel met een database.
Ik heb een connectie gemaakt. Daar heb ik mijn eerste vraag dan ook over:
Ik zal de code later hieronder plaatsen. De vraag is waarom krijg ik geen echo als de connectie mislukt en wel als deze lukt?
Code (php)
- Ariën -:
Titel aangepast van 'helemaal opnieuw' naar 'Controle op connectie met MySQLi'. Gelieve in het vervolg een titel mee te geven die je probleem of vraagstelling aangeeft.
Alvast bedankt!
Alvast bedankt!
Gewijzigd op 08/03/2017 18:40:44 door - Ariën -
Als je wilt weten of de connectie gelukt is, kijk dan naar het connect_errno() method.
Probeer om te beginnen het verschil te begrijpen tussen een waarde en een variabele...
Jullie hebben gelijk dat ik alleen het bestaan test. Nu heb ik bewust een fout gemaakt om te kijken of het werkt en krijg ik deze preek op mijn scherm:
Warning: mysqli::mysqli(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /public/sites/mijnwebsite/project/database.php on line 7
Warning: mysqli::mysqli(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in /public/sites/mijnwebsite/project/database.php on line 7
Connectie mislukt: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known
Ik test op een eigen domein. Het is dus daadwerkelijk live.
De beste oplossing is om een mooie error-handler in PHP te maken, waarin je de bezoekers geruststelt met een vriendelijke foutmelding, waarbij je met error_log ervoor zorgt dat de foutmelding netjes in een bestand wordt gelogd.
Oke, goede tip. Dan moet ik toch echt eens even zoeken hoe dat te implementeren.
Jij gebruikt reeds de OOP versie van Mysqli. Is het niet handiger om de Procedural mysqli_ functies te gebruiken?
Het maken van een connectie met de database ziet er dan zo uit:
Code (php)
Als je op php.net kijkt dan zie je bij de mysqli functies over het algemeen twee voorbeelden staan: "Object oriented style" en "Procedural style". Hou iig één van de twee aan.
Gewijzigd op 09/03/2017 00:38:39 door Frank Nietbelangrijk
Kan iemand mij dat uitleggen?
Code (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
29
30
31
32
33
34
35
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
<?php
include 'database.php';
?>
<?php
if(isset ($_POST['verzenden'])) {
echo "Formulier niet verzonden";
}else {
$voornaam = addslashes($_POST['voornaam']);
$tussenvoegsel = addslashes($_POST['tussenvoegsel']);
$achternaam = addslashes($_POST['achternaam']);
$sql = "INSERT INTO gebruikers (voornaam, tussenvoegsel, achternaam)
VALUES ('$voornaam', '$tussenvoegsel', '$achternaam')";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="registreren.php" method="post">
<input type="text" name="voornaam" value="voornaam"> <br>
<input type="text" name="tussenvoegsel" value="tussenvoegsel"> <br>
<input type="text" name="achternaam" value="achternaam"><br>
<input type="submit" name="verzenden" value="verzenden">
</form>
<?php }; ?>
</body>
</html>
[/code
include 'database.php';
?>
<?php
if(isset ($_POST['verzenden'])) {
echo "Formulier niet verzonden";
}else {
$voornaam = addslashes($_POST['voornaam']);
$tussenvoegsel = addslashes($_POST['tussenvoegsel']);
$achternaam = addslashes($_POST['achternaam']);
$sql = "INSERT INTO gebruikers (voornaam, tussenvoegsel, achternaam)
VALUES ('$voornaam', '$tussenvoegsel', '$achternaam')";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>registreren</title>
</head>
<body>
<form action="registreren.php" method="post">
<input type="text" name="voornaam" value="voornaam"> <br>
<input type="text" name="tussenvoegsel" value="tussenvoegsel"> <br>
<input type="text" name="achternaam" value="achternaam"><br>
<input type="submit" name="verzenden" value="verzenden">
</form>
<?php }; ?>
</body>
</html>
[/code
Gewijzigd op 09/03/2017 11:56:16 door Rubensky PHP starter
2. Addslashes is GEEN query beveiliging, gebruik de escaping functie die bij je database hoort.
3. Je voert nergens een query uit.
Gewijzigd op 09/03/2017 11:58:38 door - Ariën -
Toevoeging op 09/03/2017 11:59:20:
Geen tut gevolgd omdat die of vreselijk oud zijn of gelijk weer met OOP en dergelijke.
Verdiep je eens in mysqli_query, en heel de werking van mysqli. Waarom gebruik je niet w3schools?
Ken je de basis van PHP eigenlijk wel, en gaat dan geen lichtje branden dat een string op zichzelf niks met een database doet?
Gewijzigd op 09/03/2017 12:29:22 door - Ariën -
Die gebruik ik wel. Maar daar wordt niets over de verwerking van een formulier vermeld.
Als ik op MySQLi tutorial zoek vind ik toch een hoop tutorials, en die kunnen zeker niet verouderd zijn.
Gewijzigd op 09/03/2017 13:48:03 door Rubensky PHP starter
Als je gaat werken met MySQLi, bedenk dan wel of je procedureel (1) of Object Oriënted (2) gaat gebruiken. Ik raad het laatste aan. Vooral omdat je met classes meer kan doen. En je hoeft naar mijn mening dan ook niet direct te weten hoe ze werken. Maar het sluit wel mooi aan op de toekomst als je later meer met classes gaat doen. Dus richt je bij voorkeur op de toekomst.
Beiden mengen kan ook, maar dat raad ik af, al is het vanwege de afwijkende werking in enkele gevallen.
- Ariën - op 09/03/2017 13:54:44:
Beiden mengen kan ook, maar dat raad ik af, al is het vanwege de afwijkende werking in enkele gevallen.
De werking (het gedrag) van de procedurele en OOP-variant is bij mijn weten altijd hetzelfde, maar de aanroep (parameters en/of de volgorde hiervan) kan nogal eens verschillen. En soms zijn bepaalde functies of methoden aliassen van iets anders. Gebruik bij voorkeur geen aliassen, want de kans is groot dat deze in de toekomst opgeschoond worden.
Neemt niet weg dat het inderdaad niet praktisch is beide varianten door elkaar te gebruiken en ik ga mee in de voorkeur voor de OOP-wijze, met name omdat MySQLi zelf enkel met objecten werkt.
Het bovenstaande lijkt mij een iets concretere onderbouwing voor de keuze voor een bepaalde variant.
Gewijzigd op 09/03/2017 15:35:52 door Thomas van den Heuvel
Thomas van den Heuvel op 09/03/2017 01:19:08:
De controle die @Frank hierboven doet levert mogelijk niet het gewenste resultaat op, omdat mysqli_connect() altijd een object retourneert, zelfs als de connectie mislukt. Dit object evalueert dus nooit tot false en daarom is !$conn dus ook geen goede check voor het slagen of mislukken van de verbinding. Dit is de afgelopen tijd al minstens 2 keer aangehaald trouwens :p.
Gebruik de functies die php.net voorstelt: connect_error().
Gebruik de functies die php.net voorstelt: connect_error().
Thomas,
Het code voorbeeldje komt rechtstreeks van php.net en ik heb even het volgende gedaan:
Code (php)
En ik krijg dan deze foutmelding:
dat is dus geen object ;-)
if(isset($_POST["submit1"]))
{
mysqli_query("insert into gebruikers values('$_POST[t1]','$_POST[t2]','$_POST[t3]','$_POST[t4]','$_POST[r1]')");
}
?>
Alleen krijg ik de melding: Warning: mysqli_query() expects at least 2 parameters, 1 given in
Terwijl ik alles netjes invul.
Laten we even de syntax-opbouw (geen code) bekijken op http://php.net/mysqli_query
Quote:
Procedural style
mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
Dan zien we hier dat er twee parameters verplicht zijn: de verwijzing naar de connectie, en de tweede is de query zelf. Je hebt nu enkel alleen de query.
Tevens horen je variabelen buiten quotes, en raad ik een vorm van foutafhandeling aan.
Gewijzigd op 10/03/2017 13:07:32 door - Ariën -