Een notice en een fatal error

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Jansen

Robert Jansen

26/09/2016 14:34:06
Quote Anchor link
Hallo,

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


het bestand db_config.php 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
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;  
        }  

}

?>
 
PHP hulp

PHP hulp

25/12/2024 10:06:46
 
Ivo P

Ivo P

26/09/2016 14:47:07
Quote Anchor link
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
<?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;  
        }  

}

?>


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



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.
 
Remco nvt

Remco nvt

26/09/2016 14:57:30
Quote Anchor link
Puur naar de error kijkend:

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

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)
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
<?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 ;)
 
Robert Jansen

Robert Jansen

26/09/2016 15:49:27
Quote Anchor link
bedankt voor de info.
ik heb $result zo nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
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
<?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>&nbsp;</td>
                        <td><input type="submit" name="submit" value="Login"></td>
                    </tr>
                
                    
                </table>
            </form>
</body>
</html>
 
- Ariën  -
Beheerder

- Ariën -

26/09/2016 15:55:17
Quote Anchor link
Ik mis wat relevante code, maar is het niet gewoon
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$result = $user->dbConnection->query("SELECT * FROM member WHERE gebruikersnaam='$username' AND wachtwoord='$password'");

$this gebruik je alleen in een class zelf.
 
Ivo P

Ivo P

26/09/2016 16:28:25
Quote Anchor link
ik denk dat de regel wel degelijk in de class $user staat en dat $this van toepassing is.

Echter: db_conn is een class die niet heel veel bevat en eigenlijk geen query's uit kan voeren.

misschien zo iets:

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
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'inloggen');

class DB_con extends \PDO {


    function
__construct() {  

            $dsn = 'mysql:dbname='. DB_DATABASE .';host='. DB_SERVER;

            parent::__construct($dsn, DB_USERNAME, DB_PASSWORD);  
        }  

}

?>
 
Robert Jansen

Robert Jansen

26/09/2016 19:28:49
Quote Anchor link
@Ivo P waarom gebruik je PDO?
in de class User werk ik toch niet met pdo.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2016 20:43:45
Quote Anchor link
>> Dit doe ik object georiënteerd

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

}


?>
Gewijzigd op 26/09/2016 20:45:24 door Frank Nietbelangrijk
 
Ben van Velzen

Ben van Velzen

26/09/2016 21:22:27
Quote Anchor link
>> @Ivo P waarom gebruik je PDO?
>> 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
 
Ivo P

Ivo P

27/09/2016 09:35:33
Quote Anchor link
>> In de class User werk ik toch ook niet met pdo.


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.
 



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.