Undefined variable & Fatal Error bij registratie en gebruik PDO

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front-End Developer – Junior/Medior/Senior

Onze opdrachtgever Onze opdrachtgever maakt kassa’s, personeelsplanning bar-/keukenmanagement, tafelreserveringssoftware, websites en webshops. Van horeca tot retail, van leisure tot zorg: elke ondernemer mag bij hun aankloppen. 24/7 spelen ze proactief in op de markt. Met softwareontwikkeling, projectmanagement, systeemimplementatie, helpdesk en technische dienst in eigen beheer bieden ze zo zekerheid voor haar klanten. Standplaats Hengelo Waar we jou voor nodig hebben? Van sterrenrestaurant tot vakantiepark: de klanten van onze opdrachtgever zijn heel divers. Een intuïtieve orderwebsite voor een grote cateraar of een sieradenplatform voor een juwelier, je draait er je hand niet voor om. Je communiceert helder en staat klanten graag

Bekijk vacature »

Jeremy Stam

Jeremy Stam

13/03/2019 02:09:57
Quote Anchor link
Hey mensen, ik vroeg me af of er misschien iemand een kijkje kan nemen naar mijn volgende code. Ik krijg een aantal meldingen en weet even niet hoe ik deze moet oplossen.
Groeten, Jeremy

zie:


Notice: Undefined variable: password in C:\xampp\htdocs\Login2\registreren.php on line 19

Notice: Undefined variable: name in C:\xampp\htdocs\Login2\registreren.php on line 23

Notice: Undefined variable: password in C:\xampp\htdocs\Login2\registreren.php on line 23

Fatal error: Uncaught Error: Call to a member function query() on string in C:\xampp\htdocs\Login2\registreren.php:27 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Login2\registreren.php on line 27





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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
$errors
= [];

require 'db.php';

if (isset($_POST['register'])) {


    $name = filter_input(INPUT_POST, 'name');
    $email = filter_input(INPUT_POST, 'email');
    $password = filter_input(INPUT_POST, 'password');
    $cPassword = filter_input(INPUT_POST, 'cPassword');

    if ($password != $cPassword)
        $errors[] = "Passwords don't match";

    }


    if (strlen($password) < 8) {
        $errors[] = "Password not long enough!";
    }


    if ($name === $password) {
        $errors[] = "Username cannot equal password!";
    }


    $stmt = $pdo->query("SELECT 1 FROM users WHERE name = ?");
    $stmt->execute([$name]);
    $user_found = $stmt->fetchColumn();

    if ($user_found) {
        $errors[] = "Username already taken";
    }


    if (!$errors)

    {

        $hash = password_hash($password, PASSWORD_BCRYPT);
        $sql = "INSERT INTO users (name, email, password) VALUES (?,?,?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$name, $email, $hash]);

        $errors[] = "U bent geregistreerd!";
        //header( "Refresh:3; url=/Login2/inloggen.php", true, 303);
    }

    else {

        $username = "";
    }


?>

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
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
      content="width=device-width, user-scalable=no, initial-scale=1.0,
      maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" style="text/css" href="style.css">
<title>Registreren</title>
</head>
<body>
<div class="login-page">
<div class="form">

    <?php foreach ($errors as $error): ?>
        <p><?= $error ?></p>
    <?php endforeach ?>

<form class="login-form" action="registreren.php" method="post">
<input type="text" placeholder="Username" name="name" value="<?=
htmlspecialchars($username) ?>"/>
        <input type="email" placeholder="E-mail address" name="email"/>
        <input type="password" placeholder="Password" name="password"/>
        <input type="password" placeholder="Password" name="cPassword"/>
        <button name="register" type="submit">create</button>
        <p class="message">Bent u al geregistreerd? <a
                      href="inloggen.php">Keer terug</a></p>
    </form>
</div>
</div>
</body>
</html>

db.php file:
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
<?php

$host
= 'localhost';
$db = 'loginform';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
];


$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
}
catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}


?>


Ward:
Graag voortaan bij code de [code][/code]-tags gebruiken.
Hier kun je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 13/03/2019 08:10:01 door Ward van der Put
 
PHP hulp

PHP hulp

26/05/2019 16:17:04
 
Rob Doemaarwat

Rob Doemaarwat

13/03/2019 08:06:14
Quote Anchor link
De sluit accolade op regel 17 sluit de if van regel 6 (alhoewel je inspringing doet vermoed dat het om de if van regel 14 gaat, maar daar staat geen open accolade - wat op zich prima is, omdat het maar om een enkele regel gaat). Indien geen POST wordt alles na regel 17 dus toch uitgevoerd, met de onbekende vars tot gevolg.

Een beetje editor kan je precies laten zien welke haakjes (accolades, blokhaken, enz) bij elkaar horen.
 
Jeremy Stam

Jeremy Stam

13/03/2019 12:18:50
Quote Anchor link
Dag Rob,

Het duurde even voordat ik kon reageren maar ik ben er inmiddels achter wat de problemen waren. Er miste inderdaad een aantal accolades. Door het uitproberen van verschillende stukjes code ben ik wat onvoorzichtig geweest.

De Fatale error werd veroorzaakt doordat een query werdt uitgevoerd waar dit met gebruik van PDO prepare & execute zou moeten zijn.

Dus dit stukje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    $stmt = $pdo->query("SELECT 1 FROM users WHERE name = ?");


Is geworden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    $stmt = $pdo->prepare("SELECT 1 FROM users WHERE name = ?");


Bedankt voor je snelle reactie, je was er vroeg bij vanmorgen!

@Ward Excuus voor het ongemak.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/03/2019 16:47:57
Quote Anchor link
Als je dit gebruikt:

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

is het zaak dat alle PDO-gerelateerde operaties in een try-catch blok staan anders resulteert dit mogelijk alsnog in een fatal error. Immers, alle niet gevangen exceptions leveren een fatal error op.

Enkel een try-catch blok bij de creatie is dus niet genoeg.
Gewijzigd op 13/03/2019 16:48:30 door Thomas van den Heuvel
 
Jeremy Stam

Jeremy Stam

13/03/2019 16:51:31
Quote Anchor link
Dag Thomas, ik ben een aardige leek als het gaat om PHP, zou je mij eens een voorbeeldje kunnen geven gerelateerd aan de code die ik heb geplaatst?

In de DB.php staat de try catch aangegeven, waar mis ik deze dan nog?
 
Thomas van den Heuvel

Thomas van den Heuvel

13/03/2019 17:43:14
Quote Anchor link
Zoals ik al zei, om alle PDO-gerelateerde operaties, dus ook om prepare/query/execute, dus eigenlijk alles wat begint met $pdo->.
 
Jeremy Stam

Jeremy Stam

13/03/2019 20:17:29
Quote Anchor link
Ik krijg hierover verschillende signalen. De reden waarom niet alles in een try/catch block te zetten word hier aangeduid. Ik ga me er nog even verder in verdiepen.
https://stackoverflow.com/questions/272203/pdo-try-catch-usage-in-functions
 
Thomas van den Heuvel

Thomas van den Heuvel

14/03/2019 00:02:42
Quote Anchor link
Mja, maar lees ook de reacties / andere topics hier over. Als je één bron vindt op internet om iets op een bepaalde manier te doen... dat geeft je zelden het complete plaatje. Het helpt natuurlijk als de rest van je applicatie het exceptions-paradigma ook omarmt anders is PDO met ERRMODE_EXCEPTION een vreemde eend in de bijt.

Speaking of which. Waarom heb je voor PDO gekozen? :]
 
Jeremy Stam

Jeremy Stam

14/03/2019 00:21:28
Quote Anchor link
Je hebt wel een punt hoor. Ik probeer verschillende opties, de reden dat ik voor PDO heb gekozen is puur gebaseerd op informatie die ik vind online, daaruit komen mysqli en PDO toch als de veiligste manieren naar voren. Waar ik uiteindelijk zal eindigen geen idee. Zoals ik al aangaf ben ik net begonnen en is het voor mij nu allemaal nog uitproberen, goed onderbouwd waarom ik iets gebruik vind ik dan ook lastig om te doen in dit vroege stadium van mijn leerproces.
Gewijzigd op 14/03/2019 00:23:08 door Jeremy Stam
 
Thomas van den Heuvel

Thomas van den Heuvel

14/03/2019 00:51:32
Quote Anchor link
Fair enough.
Jeremy Stam op 14/03/2019 00:21:28:
daaruit komen mysqli en PDO toch als de veiligste manieren naar voren.

Geen enkele methodiek is (on)veilig als je niet weet wat deze (on)veilig maakt.

Als je bijvoorbeeld DATA gaat concateneren in een lap SQL dan is je prepared statement mogelijk nog steeds zo lek als een mand.
 



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.