Controle op connectie met MySQLi

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Thomas van den Heuvel

Thomas van den Heuvel

10/03/2017 15:08:01
Quote Anchor link
@Frank, je hebt gelijk. Dit is wel opmerkelijk, want mysqli_connect() is een alias van mysqli::__construct(). Je zou verwachten dat de return-values hetzelfde zijn maar inderdaad, bij het mislukken van de verbinding retourneert mysqli_connect() false en bij het aanmaken van een mysqli object resulteert dat in een object.

Dit invalideert echter niet mijn eerder gemaakte punten:
- vermijd het gebruik van aliassen, deze worden mogelijk op den duur opgeschoond
- voor het vaststellen van het slagen / mislukken van het opzetten van een verbinding is een aparte functie/methode (connect_error()); voor een expliciete controle zou je het resultaat hiervan kunnen vergelijken met NULL
- MySQLi werkt met objecten, daartoe lijkt de object georiënteerde aanpak de meest logische keuze
Gewijzigd op 10/03/2017 15:09:42 door Thomas van den Heuvel
 
PHP hulp

PHP hulp

22/12/2024 15:23:46
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/03/2017 18:36:41
Quote Anchor link
Ik ga wel met je mee enkel vind ik wel dat het voor een beginner/hobbyist die (nog) geen kennis van OOP heeft makkelijker is om de procedural functies te gebruiken. Vanuit de ogen van een profesional is de OOP methode beter maar een "eigen" set classes die met verschillende database drivers kunnen werken is dan nog beter.
 
Rubensky PHP starter

Rubensky PHP starter

16/03/2017 14:47:35
Quote Anchor link
Mensen daar ben ik weer. Ik heb een simpel formuliertje gemaakt 2 veldjes om te beginnen. Wat vinden jullie hiervan ben ik op de goede weg of zijn er no go's die ik moet vermijden? Bijvoorbeeld het controleren van velden met required?

php:

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
<?php

$con
= mysqli_connect("gegevens database");

if(!$con)
{

  echo "geen connectie met server";
}


if (!mysqli_select_db($con, 'databasenaam'))
{

  echo "Database niet geselecteerd";
}


$username = mysqli_real_escape_string($con, $_POST['username']);
$email = mysqli_real_escape_string($con, $_POST['email']);


$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";

if (!mysqli_query($con,$sql))
{

  echo "Niet geplaatst";
}

else {
  echo "geplaatst";
}


?>


HTML:
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
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form  action="insert.php" method="post">
      <input type="text" name="username" required>
      <input type="email" name="email" required>
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>
</html>
Gewijzigd op 16/03/2017 14:48:58 door Rubensky PHP starter
 
- Ariën  -
Beheerder

- Ariën -

16/03/2017 14:58:19
Quote Anchor link
Ik zou de validatie op de ingevulde velden ook in je PHP-code verwerken. Iedereen kan deze client-side controle eenvoudig met 'Element inspecteren' of een oude browser omzeilen. Je zou zelfs ook JavaScript kunnen gebruiken.

Ikzelf ben meer voorstander om alles in één bestand te plaatsen. Maar het is meer wat jij het lekkerste vindt werken. Uiteindelijk kan je het geheel steeds meer aanpassen na mate van je geleerde kennis. Ikzelf ontwerp mijn grote webapplicaties inmiddels uitsluitend in OOP en een MVC-model. Maar dat is niet zo interessant voor beginners. ;-)
 
Rubensky PHP starter

Rubensky PHP starter

16/03/2017 15:37:39
Quote Anchor link
Dank voor je tip. de controle van velden daar wil ik het dan als eerste eens over hebben. Wat vind jij een verstandige manier? is dat met if(empty($name) of kan je het beter nog anders doen? Het nadeel van het op die manier inrichten is dat ik op een andere pagina (namelijk insert.php) terechtkom daar moet ik nog even wat op verzinnen. :)
 
- Ariën  -
Beheerder

- Ariën -

16/03/2017 15:47:57
Quote Anchor link
empty() is niet een intelligente functie voor controle op validatie (vul maar eens een 0 in).
Ikzelf gebruik dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (trim($var)=='') {
    // leeg
}
?>
 
Rubensky PHP starter

Rubensky PHP starter

16/03/2017 16:39:23
Quote Anchor link
Dankjewel.

Ik heb denk ik een vrij domme vraag maar goed ik kom er zelf niet uit. Hoe kan je de inhoud van radiobuttons en checkboxes opslaan in een DB? van een chackbox kan je er natuurlijk meerdere hebben.
 
- Ariën  -
Beheerder

- Ariën -

16/03/2017 16:44:45
Quote Anchor link
Bij meerdere checkboxes zet je een beginnende en eindigende blokhaak achter de name in name
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<input type="checkbox" name="product[]" value="Pizza">Pizza<br>
<input type="checkbox" name="product[]" value="Spaghetti">Spaghetti

Vervolgens heb je na het versturen van het formulier een array in $_POST['product'] waarin alle gekozen waardes staan.
 
Rubensky PHP starter

Rubensky PHP starter

17/03/2017 11:52:06
Quote Anchor link
Volgend vraagje:

Ik controleer nu de inhoud van de velden via PHP (ja ik neem van jullie aan wat jullie zeggen :))

Maar nu krijg ik een fout namelijk dat wanneer ik het formulier de eerste keer inlaad krijg ik direct te zien geen emailadres ingevuld en na leeg opslaan krijg ik geen melding dat de velden niet zijn ingevuld maar de melding Undefined index: logisch want ik vul expres niets in maar dan zou ik een mijn gemaakte echo terug moeten krijgen.

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
<?php

include 'include.php';
$username = '';
$email = '';
function
validate($username, $email)
{

  $error = '';

  if ($username == '')
  $error = 'u heeft geen gebruikersnaam opgegeven';

  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  $error = 'u heeft geen geldig emailadres opgegeven';

  return $error;
}


$username = '';
$email = '';

if ($_SERVER['REQUEST_METHOD'] =='POST')
{

  $username = $_POST[''];
  $email = $_POST[''];

}



$error = validate($username, $email);
if($error != '')
  echo $error;
  else {
    $username = mysqli_real_escape_string($con, $_POST['username']);
    $email = mysqli_real_escape_string($con, $_POST['email']);



    $sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";

    if (!mysqli_query($con,$sql))
    {

      echo "Niet geplaatst";
    }

    else {
      echo "geplaatst";
    }

  }


?>


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form action="" method="post">
      <input type="text" name="username"> gebruikersnaam<br>
      <input type="email" name="email" >
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>
 
Ward van der Put
Moderator

Ward van der Put

17/03/2017 12:44:08
Quote Anchor link
Als je een webpagina opent, wordt de HTTP-methode GET gebruikt. Bij het verzenden van het formulier is dat POST (als je <form method="post"> gebruikt) en staan de postdata in $_POST. Controles van formulieren verpak je daarom bijvoorbeeld in:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ···
}
?>


Let er verder op dat je functies nu side effects hebben: ze doen twee dingen en dat is nooit goed. Hier voert de functie bijvoorbeeld niet alleen een controle uit, maar produceert de functie altijd een string, waardoor je er vervolgens elders nog stringoperaties op los moet laten om te achterhalen of het resultaat nu goed of fout is:

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
<?php
function validate($username, $email)
{

  $error = '';

  if ($username == '')
  $error = 'u heeft geen gebruikersnaam opgegeven';

  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  $error = 'u heeft geen geldig emailadres opgegeven';

  return $error;
}

?>


Het is beter (of gewoon makkelijker) als je direct aan het resultaat kunt zien of de uitkomst goed of slecht is, bijvoorbeeld:

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
<?php
/**
 * @param string $username
 * @param string $email
 *
 * @return bool
 *   Returns true on success or false on failure.
 */

function validate($username, $email)
{

    if (empty($username)) {
       return false;
    }


    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }


    return true;
}

?>

Gewijzigd op 17/03/2017 12:44:47 door Ward van der Put
 
Rubensky PHP starter

Rubensky PHP starter

17/03/2017 13:20:53
Quote Anchor link
Gisteren kreeg ik van Ariën te horen empty is geen intelligente functie. Kan beter zijn voorbeeld gebruiken.

Om van de errors af te komen hoef ik dus alleen de functie te veranderen in jou voorbeeld?
 
- Ariën  -
Beheerder

- Ariën -

17/03/2017 13:25:44
Quote Anchor link
Klopt, vul maar eens een 0. En kijk dan eens of er true of false wordt geretourneerd ;).
Je kan ook een vergelijking doen met een lege string zonder inhoud, maar daar bereik je mee dat mensen ook een spatie kunnen invoeren op een veld die verplicht is. Dus die trim()'en we dan graag.
 
Rubensky PHP starter

Rubensky PHP starter

17/03/2017 13:43:51
Quote Anchor link
Nu heb ik hem zo (aangegeven functie van hier maar dan krijg ik niet gevonden index in plaats van formulier wat gecheked wordt

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
<?php

include 'include.php';
$username = '';
$email = '';
function
validate($username, $email)
{

    if (empty($username)) {
       return false;
    }


    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }


    return true;
}


$username = '';
$email = '';

if ($_SERVER['REQUEST_METHOD'] =='POST')
{

  $username = $_POST[''];
  $email = $_POST[''];

}
else


    $username = mysqli_real_escape_string($con, $_POST['username']);
    $email = mysqli_real_escape_string($con, $_POST['email']);



    $sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";

    if (!mysqli_query($con,$sql))
    {

      echo "Niet geplaatst";
    }

    else {
      echo "geplaatst";
    }




?>


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form action="" method="post">
      <input type="text" name="username"> gebruikersnaam<br>
      <input type="email" name="email" >
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>
</html>
[/code
 
- Ariën  -
Beheerder

- Ariën -

17/03/2017 13:55:49
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$username
= $_POST[''];
  $email = $_POST[''];
?>

??? Huh ??
 
Ivo P

Ivo P

17/03/2017 14:29:44
Quote Anchor link
regel 24 tot en met 27 verwijderen.

en dan op regel 44 (in de huidige telling) een } plaatsen

Toevoeging op 17/03/2017 14:32:00:

nb: $username en $email zijn nu alleen geschikt om in de query te gebruiken.

zou je die nog op het scherm willen zetten, dan kan dat niet met $username, maar zul je terug moeten naar $_POST['username']

En dan zou je die met htmlspecialchars() kunnen echo-en.

Dit, omdat je door de mysql-escape functie de data mogelijk vervuild hebt met backslashes.
 
- Ariën  -
Beheerder

- Ariën -

17/03/2017 14:52:53
Quote Anchor link
En de else op lijn 27 mist ook een startende accolade.

Welke editor gebruik je? Want die zou eigenlijk al ergens moeten gaan schreeuwen omdat de code niet goed opgebouwd is.
 
Ivo P

Ivo P

17/03/2017 15:05:19
Quote Anchor link
na een if of en else hoeft niet per se een { te staan.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$x
= 0;
if($x == 1)
  echo 'een';
  echo 'twee';
?>

dit zal 'twee' op het scherm zetten...
 
- Ariën  -
Beheerder

- Ariën -

17/03/2017 15:08:10
Quote Anchor link
Doe dat dan in zijn geheel of niet, maar half maar het ook niet echt overzichtelijker erop in grote codes.
 
Ivo P

Ivo P

17/03/2017 15:09:17
Quote Anchor link
in dit geval is die hele "} else" verdwaald.
 
Bart V B

Bart V B

17/03/2017 16:13:31
Quote Anchor link
Jemig wat een zootje is die code geworden. :)
Hey maar we zijn zo allemaal begonnen, dus snap het wel.

Om te beginnen doe je een function aanmaken. Die kunnen heel handig zijn.
Maar dan moet je wel weten wat dat dingetje doet.
als je een function foo($metvar) maakt, dan doe je een functie met input.
Dus verwacht de functie ook iets er in, jij wil meteen met twee, kan ook.
Die ($metvar) is alleen om door te geven.
Dus wat je daar instopt is even niet van belang. Hoewel, als je de function gebruikt, wil je daar $_POST variabelen in zetten dus dat doen we pas als we de funtion aanroepen.
Even in code met uitleg:
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
<?php

include 'include.php';
// validatie
function validate($username, $email)
{

    if(isset($username) && trim($username) == '')
    {

        return false;
    }

    
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }


    return true;
}
    


if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    // input is gewoon de $_POST variabelen
    if( validate($_POST['username'], $_POST['email']) == false)
    {

        echo 'gebruikersnaam is leeg, of geen geldig email';
    }

    
    // maak de query leesbaar
    $sql = "INSERT INTO gebruikers (username,
                                    email
                                    )
                                    VALUES ('"
.mysqli_real_escape_string($con, $_POST['username'])."',
                                            '"
.mysqli_real_escape_string($con, $_POST['email']);."'
                                            )"
;
                                            
    // hier wil ik wel een variabele die leesbaar is..
    $result = mysqli_query($con,$sql)
    if(!$result)
    {

        echo 'Niet geplaatst!';
    }

    else
    {
        echo 'geplaatst!';
    }
}

?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form action="" method="post">
      <input type="text" name="username"> gebruikersnaam<br>
      <input type="email" name="email" >
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>
</html>

Ik zeg niet dat deze code perfect is, maar om je een idee te geven hoe je dingen doet (denk dat je echt even de weg kwijt bent) is deze opzet al een stuk schoner.
Zoals je ziet probeer ik mijzelf niet telkens te kopiëren. $username, $email is als input een handige naam om door te geven. Maar dat "doorgeven" hoeft niet als je het in je code zet om te posten. Want die waardes zijn al bekend snap je?
Ook een query schrijf je onder elkaar om beter te kunnen lezen.
En het escapen kan ook gewoon rechtstreeks in de sql string.
Gewijzigd op 17/03/2017 16:20:50 door Bart V B
 

Pagina: « vorige 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.