OOP - Login

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior .NET Back-end Developer in ons innovation t

Bedrijfsomschrijving Namens één van mijn betere klanten, gevestigd in de omgeving van Amstelveen, ben ik op zoek naar een ervaren Senior Back-end Developer met minimaal vier jaar werkervaring. Je komt terecht in een echte developmentorganisatie, waarbinnen momenteel ruim 40 enthousiaste mannen en vrouwen dagelijks werken aan de ontwikkeling van complexe applicaties, die veelal webbased zijn. Deze applicaties worden gebruikt door zowel grote als kleine organisaties in zowel binnen- als buitenland en zijn bedoeld om bedrijven te ondersteunen in alles wat te maken heeft met financiën. Zo levert deze organisatie standaard- en maatwerkapplicaties waarbinnen bedrijven bijvoorbeeld al hun zaken omtrent salarishuishouding

Bekijk vacature »

Wouter OOP

Wouter OOP

26/01/2011 17:11:23
Quote Anchor link
Goedemiddag,

Sinds deze week ben ik bezig met OOP. Naar mijn idee gaat het prima, maar ik wil het graag door deskundigen laten controleren.

Ik heb geprobeerd een klassiek loginsysteem naar OOP te vertalen door overnemen, afkijken en prutsen ;).

Kunnen jullie mij vertellen waarom dit goed of fout is?

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

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

{


require('classes/class.login.php');

    $loginsystem = new main("localhost","root","","login");
    $loginsystem->loginnow();
}


?>


<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.login.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 main {
    
    private $host;
    private $username;
    private $password;
    private $database;
    
   public function __construct($host, $username, $password, $database) {
       $this->host = $host;
       $this->username= $username;
       $this->password= $password;
       $this->database= $database;

       $this->connect();
   }


   private function connect() {
       mysql_connect($this->host, $this->username, $this->password);
       mysql_select_db($this->database);
   }

  
   public function loginnow() {
       $result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "' AND wachtwoord='" . mysql_real_escape_string($_POST['wachtwoord']) . "'");

       if (mysql_num_rows($result) > 0) {
             echo "Succesvol ingelogd.";
              $_SESSION['gebruikersnaam'] = $gebruikersnaam;
       }

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

?>
 
PHP hulp

PHP hulp

27/07/2021 11:34:00
 
Wouter J

Wouter J

26/01/2011 17:31:27
Quote Anchor link
- De connect functie kun je gewoon bij de construct functie zetten.
- Require kan je -vind ik- beter in het begin doen, dus voor de if
- Het OOP programmeren kan je misschien wel, maar je moet ook OOP kunnen denken. Dat betekend dat je moet leren denken in objecten. Elk object is een class.

Als je bijv. een tabel wilt maken heb je een table object, een tr object en een td object:
> Table
> Row
> Cell

Deze objecten hebben weer eigenschappen. In een Cel staat de content, in een Rij staan cellen en in een Tabel staan rijen. Deze eigenschappen zijn de properties:
> Table
- rows
> Row
- cells
> Cell
- content

Nu heb je alleen nog een gedrag/verandering toe te voegen aan de objecten. Een Cel kan content toevoegen en hij kan zichzelf tonen, een Rij kan cellen toevoegen en hij kan ook zichzelf tonen en een Tabel kan rijen toevoegen en zichzelf ook tonen. Dit zijn de methoden:
> Table
- rows
append()
write()
> Row
- cells
append()
getRows()
> Cells
- content
append()
getCells()

Nu heb je de basis van een tabel. Dit is Object geörienteerd denken en zeker nodig bij het maken van OOP.

Probeer na dit verhaal zelf eens te bedenken welke classes, properties en methodes je nodig hebt voor een login.
 
Niels K

Niels K

26/01/2011 17:57:27
Quote Anchor link
Paar dingen:

- Database zou je eigenlijk in een aparte database handler moeten stoppen.
- Zelfde geld voor sessie
- Variabelen protected, uitbreidingen moet mogelijk blijven
- POST variabelen niet direct in de klasse aanroepen, google eens op een request handler, of maak er variabelen in je methode van.

Maar goed, het concept is al niet goed, en ik quote maar even een bericht van jelmer:

Jelmer rrrr op 28/12/2010 10:17:59:
Heel heel heel strict genomen zou je inloggen en gebruikers moeten scheiden. Je hebt gebruikers, en je hebt een set classen die inloggen mogelijk maken. Die classen regelen dan het opslaan van de combinatie gebruiker – wachtwoord, (of gebruiker + openid, daarom zijn ze losgetrokken van de User class, zodat je verschillende manieren van inloggen kan maken) en die classen regelen het onthouden van de identiteit van iemand na het inloggen.

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
User_Store
- create($nickname, $email)
- get($id)

User
- id()

// regelt het onthouden van iemands identiteit (in bijv. $_SESSION)
Authentication
- __construct(User_Store $users)
  // roept $method->login($arguments) aan, en onthoudt het user-id dat die teruggeeft
- login(AuthenticationMethod $method, array $arguments)
- isLoggedIn()
  // geeft $users->get($currentUserId) terug.
- currentUser()

PasswordIdentification extends AuthenticationMethod
  // koppelt een gebruiker aan een wachtwoord
- register(User $user, $password)
  // geeft user-id terug indien gelukt
- login(array $arguments)

OpenIDIdentification extends AuthentictionMethod
- register(User $user, $openid)
 // geeft user-id terug indien gelukt
- login(array $arguments)


Maar in veel gevallen is dat misschien wat teveel, en dan zou ik zeggen dat je User_Store::create een extra argument, $password, meegeeft, en een extra method, User_Store::login($username, $password) die dan net zo werkt als User_Store::get($id), en dat je zelf de sessies e.d. afhandelt in een simpele class.
Gewijzigd op 26/01/2011 17:57:53 door Niels K
 
Wouter OOP

Wouter OOP

26/01/2011 18:16:44
Quote Anchor link
Zover bedankt voor de reacties. Waarom is het concept niet goed?

Ik behandel de database en gebruiker toch apart?

Dus:

Loginsysteem
- ConnectDB
- ConnectUser
Gewijzigd op 26/01/2011 18:34:15 door Wouter OOP
 
Wouter J

Wouter J

26/01/2011 18:44:10
Quote Anchor link
Als je mijn verhaal had gelezen moet je elk object als een aparte class maken, dus geen aparte methode...
 
Wouter OOP

Wouter OOP

26/01/2011 19:00:28
Quote Anchor link
Dus twee aparte klassen:

- ConnectDB
- ConnectUser

Ik heb je artikel wel gelezen, maar kwam niet tot die conclusie.

Een CMS zou dus kunnen zijn in aparte klassen:

- ConnectDB
methods...
- ConnectUser
methods...
- DisconnectUser
methods...
- CreateArticle
methods...
- EditArticle
methods...
- DeleteArticle
methods...
- Etc...

Correct me if I'm wrong.
Gewijzigd op 26/01/2011 21:26:48 door Wouter OOP
 
Wouter J

Wouter J

26/01/2011 22:30:58
Quote Anchor link
Dat klopt ook niet helemaal.

Je moet leren denken in objecten. Wat heb je bij een inlog systeem? Een user object en een object die ervoor zorgt dat die user ingelogd wordt.

In deze objecten/classes zitten weer eigenschappen/properties. Dit zijn voor de user bijv. naam, wachtwoord, ... Daarnaast heeft deze user class ook nog gedragsveranderingen/methoden. Je kan bijv. de naam wijzigen, rank wijzigen, ect.

Een user class zou er dus bijv. zo uit kunnen zien:
> User
- name
- rank
- pass
changeName()
changeRank()
changePass()
 
Wouter OOP

Wouter OOP

27/01/2011 13:04:43
Quote Anchor link
Dan bedoel je toch dat die reacties fout zijn?

Reactie
-reactieaanmaken
-reactiebewerken
-reactieverwijderen

Als ik alleen wil dat een gebruiker aangemeld wordt (dus niet wachtwoord aanpassen etc), dan zijn deze twee klassen toch genoeg:

ConnectDB
ConnectUser
 
Kris Peeters

Kris Peeters

27/01/2011 14:03:20
Quote Anchor link
ConnectDB en ConnectUser klinken als werkwoorden en doen dan ook meer denken aan iets wat je in een functie zou afhandelen.

Classes zijn er om objecten mee te maken. Een object is een "ding". Het lijkt dan ook logisch om classes te maken met een naam die een zelfstandig naamwoord is.

Het is een simplificatie ... op drie lijntjes krijg je het niet helemaal uitgelegd.
 
Wouter J

Wouter J

27/01/2011 14:56:03
Quote Anchor link
Connect is iets wat je als object kan doen. Je hebt in jou geval dus een class Database en een class User. Deze heeft dan de functies/methodes connect.
 
Wouter OOP

Wouter OOP

27/01/2011 18:22:38
Quote Anchor link
Vriendelijk bedankt voor alle reacties. Het werkwoord komt dus binnen het zelfstandig naamwoord.

Mag ik deze klassen in één bestand zetten zoals class_lib:

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

class database{
    
    protected $host;
    protected $username;
    protected $password;
    protected $database;

    public function connect($host, $username, $password, $database){
        $this->host = $host;
        $this->username= $username;
        $this->password= $password;
        $this->database= $database;

        mysql_connect($this->host, $this->username, $this->password);
        mysql_select_db($this->database);
    }
}


class user{

    public function connect(){
    
        $username = $_POST['gebruikersnaam'];
        $password = $_POST['wachtwoord'];
    
        $result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'");
        
        if (mysql_num_rows($result) > 0){
            echo "Succesvol ingelogd.";
            $_SESSION['gebruikersnaam'] = $username_session;
        }

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


?>
Gewijzigd op 27/01/2011 19:30:06 door Wouter OOP
 
Niels K

Niels K

27/01/2011 18:29:16
Quote Anchor link
Kan, maar als je gebruik maakt van een autoloader wordt het lastig.

Nog een paar punten:

- Waarom database gegevens in $this zetten? Alleen de connectie volstaat toch?
- Ik mis foutenafhandeling

Kan je toelicht waarom je hebt gekozen voor user::connect ?
 
Wouter OOP

Wouter OOP

27/01/2011 18:39:33
Quote Anchor link
- Autoloader is weg als je de constructor bedoeld.
- Dit is een aangepast script van iemand anders, weet niet waarom die dat gedaan heeft.
- Foutenafhandeling moet inderdaad nog.

+ Gekozen voor connect omdat we de gebruiker gaan verbinden.

Toevoeging op 27/01/2011 20:03:02:

Als ik $this weghaal dan krijg ik de volgende error uit mijn user::connect

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in ...

Iemand een idee hoe dit komt?

Toevoeging op 28/01/2011 15:44:35:

Een volgend probleem. Ik probeer even mysqli, maar het gaat niet werken omdat ik $link niet kan bereiken (regel 24):

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{
    
    protected $host;
    protected $username;
    protected $password;
    protected $database;

    public function connect(){
    
        $link = mysqli_connect($this->host, $this->username, $this->password, $this->database);
        
    }
}


class user{

    public function 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.";
        }
    }
}


?>
Gewijzigd op 28/01/2011 15:46:38 door Wouter OOP
 
Hendrik de Jager

Hendrik de Jager

01/02/2011 22:44:02
Quote Anchor link
Wouter OOP op 27/01/2011 18:39:33:

Als ik $this weghaal dan krijg ik de volgende error uit mijn user::connect

is het niet user::connect() ipv user:connect?
Gewijzigd op 01/02/2011 22:44:37 door Hendrik de Jager
 



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.