OOP - Login (vervolg)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Wouter OOP

Wouter OOP

30/01/2011 00:21:24
Quote Anchor link
Goedenavond,

Ik heb een klein vraagje over het onderwerp wat laatst is besproken: "http://www.phphulp.nl/php/forum/topic/oop-login/75926/1/".

Class Database
Class User

Nu wil ik mysqli gebruiken om de user in te loggen. Dit geeft (bij mij) alleen een probleem.

De class User kan niet bij de gegevens uit class Database, en dus geen query uitvoeren omdat ik een belangrijke parameter mis.

Voorbeeld class User (ik kan dus niet bij de variabele $link uit class Database):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$result
= mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
?>


Dit maakt de class Database dus overbodig?

Het volledige script (class_lib.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
<?php

class database{

    public function connect(){
    
        $link = mysqli_connect('localhost','root','','login');
        
    }
}


class user{

    public function connect(){
    
    $link = database::connect(); //werkt niet

        $username = $_POST['gebruikersnaam'];
        $password = $_POST['wachtwoord'];

        $result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
        
        if (mysqli_num_rows($result) > 0){
            echo "Succesvol ingelogd.";
        }

        else{
            echo "Vul gebruikersnaam / wachtwoord in.";
        }
    }
}


?>
Gewijzigd op 30/01/2011 01:16:55 door Wouter OOP
 
PHP hulp

PHP hulp

25/04/2024 18:09:04
 
Mar cel

Mar cel

30/01/2011 13:34:47
Quote Anchor link
Geef je database object mee als parameter in je construct.
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
<?php

class database{

    public function connect(){
    
        $link = mysqli_connect('localhost','root','','login');
        
    }
}


$database = new Database;

$user = new User($database);

class user{

private $_database;

    public function connect(database $database){
    
     $this->_database = $database; //nu kan je gewoon alle functies gebruiken uit je db object via $this->_database->functie()


        $username = $_POST['gebruikersnaam'];
        $password = $_POST['wachtwoord'];

        $result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
        
        if (mysqli_num_rows($result) > 0){
            echo "Succesvol ingelogd.";
        }

        else{
            echo "Vul gebruikersnaam / wachtwoord in.";
        }
    }
}


?>
Gewijzigd op 30/01/2011 13:35:58 door Mar cel
 
Pim -

Pim -

30/01/2011 13:49:22
Quote Anchor link
Gebruik objecten...
Dus ook het MySQLi object
 
Wouter OOP

Wouter OOP

30/01/2011 17:40:21
Quote Anchor link
Bedankt voor de hulp zover. Ik gebruik ook objecten in php, alleen niet in mysqli.
Zou je me een voorbeeld kunnen geven hoe ik dat hier zou kunnen gebruiken?
 
Wouter J

Wouter J

30/01/2011 17:54:54
Quote Anchor link
Je hebt nu mysqli_connect dat is gewoon een mysql interface. Wat je het best kunt gebruiken is de objecten interface van mysqli:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = new mysqli('localhost', 'naam', 'pass', 'db');

Wat leesstof: http://phptuts.nl/view/26/
 
Bas IJzelendoorn

Bas IJzelendoorn

30/01/2011 17:57:16
Quote Anchor link
Zou je in het vervolg als het over vrijwel dezelfde vraag/script gaat, zoals je al zelf zegt, in hetzelfde topic willen doorgaan?![/modedit]
Gewijzigd op 30/01/2011 17:58:19 door Bas IJzelendoorn
 
Wouter OOP

Wouter OOP

31/01/2011 22:40:52
Quote Anchor link
The Dutch Guy op 30/01/2011 17:57:16:
Zou je in het vervolg als het over vrijwel dezelfde vraag/script gaat, zoals je al zelf zegt, in hetzelfde topic willen doorgaan?![/modedit]

Ik zal hier voortaan op letten. Helaas antwoordde niemand meer, vandaar.

De bovenstaande code heb ik wat aangepast, maar bij mij werkt het niet. Wat doe ik fout?

index.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
<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST')

{


require('classes/class_lib.php');

    $database = new database;
    
    $user = new user($database);
    $user->connect($database);
}


?>


<html>

<head>
<title>login</title>
</head>

<body>
<ul>
<form class="user" method="post" action="index.php">
<li>Naam: <input class="user" type="text" size="10" maxlength="40" name="gebruikersnaam"></li>
<li>Wachtwoord: <input class="user" type="password" size="10" maxlength="10" name="wachtwoord"></li>
<input class="submit_user" type="submit" value="Inloggen">
</form>
</ul>
</body>

</html>

class_lib.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
<?php

class database{

    public function connect(){
    
        $link = mysqli_connect('localhost','root','','login');
        
    }
}


class user{

protected $_database;

    public function connect($database){
    
    $this->_database = $database;
    $link = $this->_database->connect();

        $username = $_POST['gebruikersnaam'];
        $password = $_POST['wachtwoord'];

        $result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
        
        if (mysqli_num_rows($result) > 0){
            echo "Succesvol ingelogd.";
        }

        else{
            echo "Vul gebruikersnaam / wachtwoord in.";
        }
    }
}


?>


Warning: mysqli_query() expects parameter 1 to be mysqli, null given in...
Gewijzigd op 31/01/2011 22:43:00 door Wouter OOP
 
Wouter J

Wouter J

31/01/2011 22:49:51
Quote Anchor link
- Gebruik de OOP interface van MySQLi
- Mysql_error is geen MySQLi.
- Gebruik geen or die in OOP, doe mooie foutafhandeling met exceptions
- Regel 21 en 22 onnodig variabele kopiëren
- Gebruik geen superglobals in OOP, laat de gebruik die invoeren.
- Functie connect geeft niet aan wat er gebeurd. Noem hem bijv. login.
 
Pim -

Pim -

31/01/2011 22:56:05
Quote Anchor link
- Regel 21 en 22 onnodig variabele kopiëren

Onzinnig...

Ik neem aan dat je de basale concepten van OOP kent. Een daarvan is 'Encapsulation', het scheiden van verantwoordelijkheden. Dit geldt voor objecten, maar helemaal voor methodes. De functie user::connect() mag dus niet de database laten verbinden EN de gebruiker in laten loggen.

Ook mag het object geen gegevens uit server data halen, deze moet je als argumenten invoeren en mag het geen data echoën, alleen teruggeven.
 
Wouter OOP

Wouter OOP

31/01/2011 23:18:50
Quote Anchor link
Nu begrijp ik er niks meer van :P

De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?
 
Pim -

Pim -

31/01/2011 23:32:08
Quote Anchor link
Nee, dat kan wel, maar user::connect(), wat inderdaad beter user::login() kan heten, mag nooit Database::connect() aanroepen.

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
class user{

protected $_database;

    public function setDatabas($database){
    
        $this->_database = $database;

    }


    public function login($username, $password){
    
        // Gebruik MySQLi's OOP interface
        // Laat het database object bij fouten exceptions geven
        // Gebruik prepared statements

        $result = $this->_database->query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password);
        
        if ($result->num_rows > 0){
            return true; // Hoe dat wordt weergegeven is niet de verantwoordelijkheid van dit object
        }
        else{
            return false;
        }
    }
}
 

31/01/2011 23:33:45
Quote Anchor link
Wouter OOP op 31/01/2011 23:18:50:
Nu begrijp ik er niks meer van :P

De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?


Inderdaad. Als je verder gaat op deze weg, dan doe je geen OOP maar dan doe je stukke code in klassen en methodes dumpen.
Het maakt de User object niet uit waar de inlog-gegevens e.d. vandaan komen, het zou bijvoorbeeld ook uit een XML bestand kunnen komen. Dat is dus het mooie aan OOP, je hoeft maar één keer code te schrijven die in meerdere situaties werkt.
En ja ik voer het misschien wel ver door... Maar goed, ga maar eens spaghetti-code in Java maken, daar wordt je niet blij van. Dus dan kan je het net zo goed direct in één keer goed doen.
Verder is er volgens mij in je vorige topic het e.e.a. ook al uitgelegd.
Gewijzigd op 31/01/2011 23:35:16 door
 



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.