Undefined variable & Fatal Error bij registratie en gebruik PDO
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)
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
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 = "";
}
?>
$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)
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
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>
<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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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());
}
?>
$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!
Hier kun je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 13/03/2019 08:10:01 door Ward van der Put
Een beetje editor kan je precies laten zien welke haakjes (accolades, blokhaken, enz) bij elkaar horen.
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:
Is geworden:
Bedankt voor je snelle reactie, je was er vroeg bij vanmorgen!
@Ward Excuus voor het ongemak.
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
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->.
Speaking of which. Waarom heb je voor PDO gekozen? :]
Gewijzigd op 14/03/2019 00:23:08 door Jeremy Stam
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.