Controle op connectie met MySQLi

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Rubensky PHP starter

Rubensky PHP starter

08/03/2017 18:30:33
Quote Anchor link
Mensen,

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)
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
<?php
$servername
= "host";
$username = "username";
$password = "password";

// Create connection
$conn = new mysqli("host","username","password","naam");
// Check connection
if (!$conn) {
    echo"connectie mislukt";
}
else{
echo "Connected successfully";
}

?>


 

- 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!
Gewijzigd op 08/03/2017 18:40:44 door - Ariën -
 
PHP hulp

PHP hulp

01/11/2024 01:08:25
 
- Ariën  -
Beheerder

- Ariën -

08/03/2017 18:39:34
Quote Anchor link
Je controleert alleen of $conn niet bestaat, en dat heeft geen weet van de connectie met je database.

Als je wilt weten of de connectie gelukt is, kijk dan naar het connect_errno() method.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($con->connect_errno) {
    echo "Connectie mislukt: (" . $conn->connect_errno . ") " . $conn->connect_error;
}

?>
 
Ward van der Put
Moderator

Ward van der Put

08/03/2017 19:09:41
Quote Anchor link
Probeer om te beginnen het verschil te begrijpen tussen een waarde en een variabele...
 
Rubensky PHP starter

Rubensky PHP starter

08/03/2017 21:46:08
Quote Anchor link
Een waarde is toch de inhoud van de variabelen?

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.
 
- Ariën  -
Beheerder

- Ariën -

08/03/2017 21:53:11
Quote Anchor link
Als het 'live' is kan je PHP-errors beter uitzetten. Het verklapt voldoende voor hackers en anders gespuis, en met deze "Chinese" taal maak je mensen bang ("Help, mijn browser/$browsernaam) is stuk"). Ja, die mensen heb ik wel eens gezien. ;-)

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.
 
Rubensky PHP starter

Rubensky PHP starter

08/03/2017 22:05:59
Quote Anchor link
Oke, goede tip. Dan moet ik toch echt eens even zoeken hoe dat te implementeren.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/03/2017 00:36:15
Quote Anchor link
Heel belangrijk is ook om te begrijpen hoe een functie/method werkt. Veel starters zijn zich niet bewust dat ze een reeks aan in php ingebouwde functies gebruiken en dat die functies iets terug kunnen geven.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$conn
= mysqli_connect('localhost', 'username', 'password', 'database');

if (!$conn) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

?>


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
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2017 01:19:08
Quote Anchor link
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().
 
Rubensky PHP starter

Rubensky PHP starter

09/03/2017 11:47:44
Quote Anchor link
Ik laat de error afhandeling nog even varen. Eerst wil ik iets anders leren :) Ik maak een scriptje waarmee ik gegevens uit een formulier in een database wil proppen. Alleen heb ik nooit goed begrepen waar ik de mist in ga met de verwerking.

Kan iemand mij dat uitleggen?

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
<?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
Gewijzigd op 09/03/2017 11:56:16 door Rubensky PHP starter
 
Ben van Velzen

Ben van Velzen

09/03/2017 11:50:53
Quote Anchor link
1. Je controleert nergens of het formulier gesubmit is.
2. Addslashes is GEEN query beveiliging, gebruik de escaping functie die bij je database hoort.
3. Je voert nergens een query uit.
 
- Ariën  -
Beheerder

- Ariën -

09/03/2017 11:58:19
Quote Anchor link
Welke tutorial volg je? Want je lijkt steeds wat stappen te missen.
Gewijzigd op 09/03/2017 11:58:38 door - Ariën -
 
Rubensky PHP starter

Rubensky PHP starter

09/03/2017 11:58:30
Quote Anchor link
Oke addslashes moeten dus weg. de query voer ik toch uit met insert into?

Toevoeging op 09/03/2017 11:59:20:

Geen tut gevolgd omdat die of vreselijk oud zijn of gelijk weer met OOP en dergelijke.
 
- Ariën  -
Beheerder

- Ariën -

09/03/2017 12:00:52
Quote Anchor link
Nee, je slaat nu een string met enkel een SQL-opdracht op in het geheugen, en doet er niks mee.

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 -
 
Rubensky PHP starter

Rubensky PHP starter

09/03/2017 12:25:23
Quote Anchor link
Die gebruik ik wel. Maar daar wordt niets over de verwerking van een formulier vermeld.
 
- Ariën  -
Beheerder

- Ariën -

09/03/2017 12:26:43
Quote Anchor link
Als ik op MySQLi tutorial zoek vind ik toch een hoop tutorials, en die kunnen zeker niet verouderd zijn.
 
Rubensky PHP starter

Rubensky PHP starter

09/03/2017 13:47:50
Quote Anchor link
Dank. Ik zal uiteraard iets laten weten als ik een goede tut heb en het voor elkaar heb gekregen om gegevens in een database te stoppen.
Gewijzigd op 09/03/2017 13:48:03 door Rubensky PHP starter
 
- Ariën  -
Beheerder

- Ariën -

09/03/2017 13:54:44
Quote Anchor link
je weet zelf al met PHP hoe je een formulier moet afhandelen? De verwerking naar een MySQL database is precies hetzelfde, alleen moet je als extraatje de boel escapen met mysqli_real_escape_string(...) 1 of $mysqli->real_escape_string(....)2.

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2017 15:34:16
Quote Anchor link
- 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
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/03/2017 18:10:58
Quote Anchor link
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().


Thomas,

Het code voorbeeldje komt rechtstreeks van php.net en ik heb even het volgende gedaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$conn
= mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
echo get_class($conn);
?>


En ik krijg dan deze foutmelding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Warning: get_class() expects parameter 1 to be object, boolean given in ...


dat is dus geen object ;-)
 
Rubensky PHP starter

Rubensky PHP starter

10/03/2017 12:49:01
Quote Anchor link
Nu heb ik als afhandeling deze:

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.
 
- Ariën  -
Beheerder

- Ariën -

10/03/2017 13:07:13
Quote Anchor link
Nee...

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 ] )


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 -
 

Pagina: 1 2 3 volgende »



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.