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:

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

<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:

<?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());
}

?>


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.
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:


    $stmt = $pdo->query("SELECT 1 FROM users WHERE name = ?");


Is geworden:


    $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.

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.
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?
Zoals ik al zei, om alle PDO-gerelateerde operaties, dus ook om prepare/query/execute, dus eigenlijk alles wat begint met $pdo->.
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? :]
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.
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.

Reageren