Een notice en een fatal error
Ik ben bezig om een login systeem te maken. Dit doe ik object georiënteerd.
Maar ik krijg twee foutmeldingen waardoor dit niet werkt.
De twee meldingen zijn:
Notice: Undefined property: User::$DB_con in C:\xampp\htdocs\php\oop\inloggen\inloggen.php on line 18
Fatal error: Call to a member function query() on null in C:\xampp\htdocs\php\oop\inloggen\inloggen.php on line 18
mijn vraag is: hoe kan ik dit oplossen zodat het inloggen wel werkt?
alvast bedankt:
mijn code is:
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
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
<?php
include "db_config.php";
class User{
public function __construct(){
$conn = new DB_con();
}
public function Login($username, $password){
global $conn;
$result = $this->DB_con->query("SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password); //hier gaat het fout
if ($result->num_rows > 0)
{
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
}
else
{
return false;
}
}
}?>
include "db_config.php";
class User{
public function __construct(){
$conn = new DB_con();
}
public function Login($username, $password){
global $conn;
$result = $this->DB_con->query("SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password); //hier gaat het fout
if ($result->num_rows > 0)
{
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
}
else
{
return false;
}
}
}?>
het bestand db_config.php is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'inloggen');
class DB_con {
function __construct() {
$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$conn)
{
die ("Cannot connect to the database");
}
return $conn;
}
}
?>
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'inloggen');
class DB_con {
function __construct() {
$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$conn)
{
die ("Cannot connect to the database");
}
return $conn;
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'inloggen');
class DB_con {
public $conn;
function __construct() {
$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$conn)
{
die ("Cannot connect to the database");
}
$this->conn = $conn;
}
}
?>
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'inloggen');
class DB_con {
public $conn;
function __construct() {
$conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if(!$conn)
{
die ("Cannot connect to the database");
}
$this->conn = $conn;
}
}
?>
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
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
<?php
include "db_config.php";
class User{
protected $db;
public function __construct(){
$this->db = new DB_con();
}
public function Login($username, $password){
$result = mysqli_query( $this->DB_con->conn, "SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?"); //hier gaat het fout
if ($result->num_rows > 0)
{
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
}
else
{
return false;
}
}
}?>
include "db_config.php";
class User{
protected $db;
public function __construct(){
$this->db = new DB_con();
}
public function Login($username, $password){
$result = mysqli_query( $this->DB_con->conn, "SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?"); //hier gaat het fout
if ($result->num_rows > 0)
{
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
}
else
{
return false;
}
}
}?>
Zo iets, maar dan mag je zelf nog die ? tot parameters omzetten.
Of beter nog: zorg dat DB_con gewoon PDO extends en dan kun je in jouw class OOP gebruiken.
Je gebruikt nu procedureeel (mysqli_connect) en OOP ( ->query() ) door elkaar.
Nog los van het feit dat de variabelen niet op magische wijze van de ene in de andere class beschikbaar komen.
In de constructor doe je:
$conn = new DB_con();
Die variable is alleen beschikbaar in die constructor functie. Je moet een variable maken in de class en die kan je dan aanroepen in je Login functie.
Dus krijg je iets als:
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
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
include "db_config.php";
class User
{
protected $dbConnection;
public function __construct()
{
$this->dbConnection = new DB_con();
}
public function Login($username, $password)
{
$result = $this->dbConnection->query("SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password); //hier gaat het fout
if ($result->num_rows > 0) {
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
} else {
return false;
}
}
}
?>
include "db_config.php";
class User
{
protected $dbConnection;
public function __construct()
{
$this->dbConnection = new DB_con();
}
public function Login($username, $password)
{
$result = $this->dbConnection->query("SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password); //hier gaat het fout
if ($result->num_rows > 0) {
$_SESSION['login'] = true;
$_SESSION['uid'] = $user_data['id'];
return true;
} else {
return false;
}
}
}
?>
Gebruik geen global $var!
Letterlijk is dit misschien wel oop, maar probeer in de volgende stappen taken gescheiden te houden.
Elke class is maar voor 1 ding verantwoordelijk. Dus:
- 1 class spreekt met de DB (een model/repository)
- 1 class spreekt met de sessions
Alles heeft dus zijn eigen verantwoordelijkheid.
Je zou dan voor inloggen iets krijgen als: (in de commentbox geschreven)
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
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
<?php
include 'db.php';
include 'session.php';
include 'userModel.php';
$db = new DB('server', 'username', 'password');
$db->setDatabase('database');
$session = new Session();
$userModel = new UserModel();
$userModel->setDB($db);
$user = $userModel->findUserByUsernameAndPassword('test', 'password');
if (null === $user) {
echo 'User niet gevonden';
} else {
$session->setSession('login', true);
$session->setSession('uid', $user->getId());
echo 'User gevonden en ingelogd';
}
[/code]
Dan kan je daarna kijken naar Dependency Injection ;)
include 'db.php';
include 'session.php';
include 'userModel.php';
$db = new DB('server', 'username', 'password');
$db->setDatabase('database');
$session = new Session();
$userModel = new UserModel();
$userModel->setDB($db);
$user = $userModel->findUserByUsernameAndPassword('test', 'password');
if (null === $user) {
echo 'User niet gevonden';
} else {
$session->setSession('login', true);
$session->setSession('uid', $user->getId());
echo 'User gevonden en ingelogd';
}
[/code]
Dan kan je daarna kijken naar Dependency Injection ;)
ik heb $result zo nu:
Code (php)
1
$result = $this->dbConnection->query("SELECT * FROM member WHERE gebruikersnaam='$username' AND wachtwoord='$password'");
de prepared statements doe ik wel later.
Maar ik krijg de melding: Fatal error: Call to undefined method DB_con::query() in C:\xampp\htdocs\php\oop\inloggen\inloggen.php on line 17
en $result is regel 17
Dit is mijn code van index.php; zit hier een fout in?
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
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
<?php
session_start();
include_once 'inloggen.php';
$user = new User();
if (isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$user = $user->Login($username, $password);
if ($user) {
header("location:home.php");
} else {
echo "<script>alert('Emailid / Password Not Match')</script>";
}
}
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="" method="post" name="login">
<table class="table " width="400">
<tr>
<th>UserName or Email:</th>
<td><input type="text" name="username" required></td>
</tr>
<tr>
<th>Password:</th>
<td><input type="password" name="password" required></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" value="Login"></td>
</tr>
</table>
</form>
</body>
</html>
session_start();
include_once 'inloggen.php';
$user = new User();
if (isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$user = $user->Login($username, $password);
if ($user) {
header("location:home.php");
} else {
echo "<script>alert('Emailid / Password Not Match')</script>";
}
}
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="" method="post" name="login">
<table class="table " width="400">
<tr>
<th>UserName or Email:</th>
<td><input type="text" name="username" required></td>
</tr>
<tr>
<th>Password:</th>
<td><input type="password" name="password" required></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit" value="Login"></td>
</tr>
</table>
</form>
</body>
</html>
Code (php)
1
$result = $user->dbConnection->query("SELECT * FROM member WHERE gebruikersnaam='$username' AND wachtwoord='$password'");
$this gebruik je alleen in een class zelf.
Echter: db_conn is een class die niet heel veel bevat en eigenlijk geen query's uit kan voeren.
misschien zo iets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
in de class User werk ik toch niet met pdo.
Met alle respect maar ik denk dat je bedoelt dat je het probeert op de OOP manier want de code die je laat zien heeft maar weinig met OOP te maken. Ik vraag me dus een beetje af of je enkel benieuwd bent naar de foutmeldingen die je krijgt of dat je geholpen wilt worden in het OO denken?
Om dan direct maar wat hints te geven:
- één class = één verantwoordelijkheid. zodra je kunt zeggen dat een class dit en dat doet dan zit je al verkeerd.
Een User class die ook iets met je database laag doet is dan ook niet handig. Je moet die User ook kunnen doorgeven aan een andere functie of deze kunnen opslaan in de sessie. Dit zijn twee voorbeelden waarbij je helemaal geen database hoeft/kan gebruiken.
een hele simpele maar correcte 'User' class zou iets als dit kunnen zijn:
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
53
54
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
<?php
class User
{
private $username;
private $email;
public function setUsername($username)
{
$this->username = $username;
return $this;
}
public function getUsername($username)
{
return $this->username;
}
public function setEmail($email)
{
$this->email = $email;
return $this;
}
public function getEmail($email)
{
return $this->email;
}
/*
* zie http://php.net/manual/en/function.serialize.php
*/
public function serialize()
{
return serialize(array(
$this->username,
$this->email,
));
}
public function unserialize($serialized)
{
list (
$this->username,
$this->email,
) = unserialize($serialized);
}
}
?>
class User
{
private $username;
private $email;
public function setUsername($username)
{
$this->username = $username;
return $this;
}
public function getUsername($username)
{
return $this->username;
}
public function setEmail($email)
{
$this->email = $email;
return $this;
}
public function getEmail($email)
{
return $this->email;
}
/*
* zie http://php.net/manual/en/function.serialize.php
*/
public function serialize()
{
return serialize(array(
$this->username,
$this->email,
));
}
public function unserialize($serialized)
{
list (
$this->username,
$this->email,
) = unserialize($serialized);
}
}
?>
Gewijzigd op 26/09/2016 20:45:24 door Frank Nietbelangrijk
>> in de class User werk ik toch niet met pdo.
En dat is erg omdat? Je kunt het toch ombouwen naar hoe jij werkt?
Gewijzigd op 26/09/2016 21:27:34 door Ben van Velzen
in de database class uit je openingspost gebruik je procedureel: mysqli_connect.
in de user class echter
$result = $this->DB_con->query("SELECT * FROM member WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password);
wat iets op een oop manier lijkt.
Vandaar dus.
Maar je kunt natuurlijk ook http://php.net/manual/en/class.mysqli.php gebruiken. In elk geval moet je niet procedureel en oop door elkaar gebruiken.
Dat is 1 fout.
De andere fout lag dus in het feit dat je kwijt lijkt te zijn waar variabelen zichtbaar zijn als je ze ergens in een function / class aanmaakt.